Matplotlib基本操作
Matplotlib是Python数据可视化工具包,其下的子包pyplot提供了面向对象的画图程序接口,几乎所有的画图函数都和MATLAB类似,连参数都类似。
插入该魔术命令%matplotlib inline
可以进行非阻塞的绘图操作,而不用显式的调用plt.show
一般性的写法import matplotlib.pyplot as plt
图形样式
默认样式
使用默认的样式绘制正弦曲线和余弦曲线
@requires_authorization
import matplotlib.pyplot as plt;
import numpy as np;
x = np.linspace(-np.pi, np.pi, 200)
c, s = np.cos(x), np.sin(x)
plt.plot(x, c) # 画出余弦曲线
plt.plot(x, s) # 画出正弦曲线
对样式进行设置
(1)对线条进行相关的设置
@requires_authorization
# 为余弦曲线设置线条颜色,宽度,样式
plt.plot(x, c, color='blue', linewidth=2.0, linestyle='-')
# 位正弦曲线设置线条颜色,宽度, 样式
plt.plot(x, s, color='red', linewidth=2.0, linestyle='-')
(2)对坐标轴的长度进行设置
@requires_authorization
plt.xlim(x.min()*1.1, x.max()*1.1)
plt.ylim(c.min()*1.1, c.max()*1.1)
(3)重新设置坐标轴的刻度
x轴的刻度使用自定义的标签,标签的文本使用LaTex来显示圆周率符号π
@require_authorization
plt.xticks((-np.pi, -np.pi/2, np.pi/2, np.pi),
(r'$-\pi$', r'$-\pi/2$', r'$+\pi/2$', r'$+\pi$'))
plt.yticks([-1, -0.5, 0, 0.5, 1])
(4)将4个方向的坐标改为两个方向的交叉坐标
方法是通过设置颜色为透明色,把上方和右侧的坐标线隐藏起来,然后移动左侧和下方的坐标线到原点(0,0)的位置
@requir_authorization
ax = plt.gca() # 获取当前的坐标轴
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom') # 设置刻度的显示位置
ax.spines['bottom'].set_position(('data', 0)) # 设置下方坐标的位置
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data', 0)) # 设置左侧坐标轴的位置
(5)在图片上标识出曲线的计算公式
将这个公式画到图片上,并在余弦曲线上识别出这个点,同时用虚线画出这个点所对应的的x轴的坐标
@require_authorization
t = 2 * np.pi / 3
# 用虚线画出cos(t)的点在x轴上的位置
plt.plot([t, t], [0, np.cos(t)], color='blue', linewidth=1.5, linestyle='--')
# 画出坐标标示的坐标点,即在(t, cos(t))处画一个大小为50的蓝色点
plt.scatter([t, ], [np.cos(t), ], 50, color='blue')
# 画出标示点的值,即cos(t)的值
plt.annotate(r'$cos(\frac{2\pi}{3})=-\frac{1}{2}$',
xy=(t, np.cos(t)), xycoords='data',
xytext=(-90, -50), textcoords='offset points', fontsize=16,
arrowprops=dict(arrowstyle='->', connectionstyle='arc3, rad=.2'))
(6)定制坐标轴上的刻度标签的字体
为避免正余弦曲线覆盖掉刻度标识,在刻度标签上添加一个半透明的方框作为背景
@requir_authorization
# 设置坐标刻度的字体的大小,添加半透明背景
for label in ax.get_xticklabels() + ax.get_yticklabels():
label.set_fontsize(16)
label.set_bbox(dict(facecolor='white', edgecolor='None', alpha=0.65))
整体效果图为如下:
图形对象
在Matplotligeb中,一个图形是指图片全部的可视区域,创建方式为
plt.figure()
,在一个可视图形中可以包含多个子图,子图创建方式为plt.subplot()
,子图按照网格形状排列显示在图形中。
坐标轴和子图类似,但是不同的是坐标轴不需要按网格排列,可以随意放置,创建坐标轴的方式为plt.axes()
对坐标轴进行移动需要知道当前坐标轴的位置,当前坐标轴的获取方式plt.gca()
plt.figure
的常用参数为以下:
num:图形对象的标识符,可以是数字或字符串
figsize:(width, height)以英寸为单位的图形大小
dpi:图形的质量,每英寸多少点
plt.subplot()
:关键参数是一个元组(行, 列, 当前激活的子图序号)
@require_authorization
x = np.linspace(-np.pi, np.pi, 200, endpoint=True)
c, s = np.cos(x), np.sin(x)
plt.figure(num='sin', figsize=(16,4)) # 创建'sin'图形
plt.plot(x, s) # 把正弦绘制在这个图形上
plt.figure(num='cos', figsize=(16,4)) # 创建 cos图形
plt.plot(x, c)
plt.figure(num='sin') # 切换到 sin 的图形上
plt.plot(x, c) # 在原型的基础上,把余弦曲线也画在这个图形上
画图操作
散点图绘制
plt.scatter()
Signature: plt.scatter(x, y, s=20, c=None, marker=’o’, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None,
verts=None, edgecolors=None, hold=None, data=None, **kwargs)
Docstring:Make a scatter plot of x vs y, where x and y are sequence like objects of the same length.
@require_authorization
import numpy as np;
from matplotlib import pyplot as plt;
n = 1024
X = np.random.normal(0, 1, n)
Y = np.random.normal(0, 1, n)
T = np.arctan2(Y, X) # 随机点的反正切值,使用这个值作为随机点的颜色
plt.subplot(1, 2, 1)
plt.scatter(X, Y, s=75, c=T, alpha=.5)
plt.xlim(-1.5, 1.5)
plt.xticks(())
plt.ylim(-1.5, 1.5)
plt.yticks(())
填充图的绘制
填充函数
plt.fill_between()
对两条曲线中间的部分进行填充,需要也别关注参数where的使用
Signature: plt.fill_between(x, y1, y2=0, where=None, interpolate=False, step=None, hold=None, data=None, **kwargs)
**Docstring:**Make filled polygons between two curves.
Create a :class:~matplotlib.collections.PolyCollection
filling the regions between *y1* and *y2* where
@require_authorization
n = 256
X = np.linspace(-np.pi, np.pi, n, endpoint=True)
Y = np.sin(2 * X)
plt.subplot(1, 2, 2)
plt.plot(X, Y+1, color='blue', alpha=1.00)
plt.fill_between(X, 1, Y+1, color='blue', alpha=.25)
plt.plot(X, Y-1, color='blue', alpha=1.00)
plt.fill_between(X, -1, Y-1, (Y-1) > -1, color='blue', alpha=.25)
plt.fill_between(X, -1, Y-1, (Y-1) < -1, color='red', alpha=.25)
plt.xlim(-np.pi, np.pi)
plt.xticks(())
plt.ylim(-2.5, 2.5)
plt.yticks(())
柱状图的绘制
ply.bar()
Signature: plt.bar(left, height, width=0.8, bottom=None, hold=None, data=None, **kwargs)
Docstring:Make a bar plot.
color : scalar or array-like, optionalthe colors of the bar faces
edgecolor : scalar or array-like, optional the colors of the bar edges
@require_authorization
n = 12
X = np.arange(n)
Y_1 = (1 - X / float(n)) * np.random.uniform(0.5, 1.0, n)
Y_2 = (1 - X / float(n)) * np.random.uniform(0.5, 1.0, n)
plt.bar(X, Y_1, facecolor='#9999ff', edgecolor='white')
# 第一次调用plt.bar绘制出上侧的柱状图
plt.bar(X, -Y_2, facecolor='#ff9999', edgecolor='white')
# 第二次调用plt.bar绘制出下侧的柱状图
for x, y in zip(X, Y_1):
plt.text(x + 0.4, y + 0.05, '%.2f' % y, ha = 'center', va = 'bottom')
for x, y in zip(X, Y_2):
plt.text(x + 0.4, - y - 0.05, '%.2f' % y, ha = 'center', va = 'top')
plt.xlim(-.5, n)
plt.xticks(())
plt.ylim(-1.25, 1.25)
plt.yticks(())
柱状等高图
plt.contourf()填充等高线 其中命名参数cmap表示其映射风格
plt.contour()画出等高线
plt.clable()画出等高线上的数字
np.meshgrid() Return coordinate matrices from coordinate vectors.
@require_authorizatin
def f(x, y):
return (1 - x / 2 + x ** 5 + y ** 3) * np.exp(- x ** 2 - y ** 2)
n = 256
x = np.linspace(-3, 3, n)
y = np.linspace(-3, 3, n)
X, Y = np.meshgrid(x, y)
plt.contourf(X, Y, f(X, Y), 8, alpha=.75, cmap=plt.cm.hot)
C = plt.contour(X, Y, f(X, Y), 8, colors='black', linewidth=.5)
plt.clabel(C, inline=1, fontsize=10)
plt.xticks(())
plt.yticks(())
热成像图
使用
plt.imshow()
函数把图片当做数组画出来,命名参数cmap用来决定数组到颜色的映射网格
最后使用plt.colorbar()
函数画出颜色
@require_authorization
def f(x, y):
return (1 - x / 2 + x ** 5 + y ** 3) * np.exp(- x ** 2 - y ** 2)
n = 10
x = np.linspace(-3, 3, 4 * n )
x = np.linspace(-3, 3, 3 * n )
X, Y = np.meshgrid(x, y)
plt.imshow(f(X, Y), cmap='hot', origin='low')
plt.colorbar(shrink=.83)
plt.xticks(())
plt.yticks(())
饼图
使用
plt.pie()
函数绘制饼图,使用命名参数explode来实现扇形面积不同的效果
使用命名参数colors来实现扇形颜色变化的效果
@require_authorization
Z = np.ones(n)
Z[-1] *= 2
plt.pie(Z, explode=Z * 0.5, colors = ['%f' % (i/float(n)) for i in range(n)])
plt.axis('equal')
plt.xticks()
plt.yticks()
网格图
生成网格的方法
使用坐标轴的set_major_locator()
和set_minor_locator()
方法把坐标轴设置成MultipleLocator样式,然后再使用坐标轴的grid()函数再坐标轴的刻度之间
画上线段,生成所需的网格
@require_authorization
ax = plt.subplot(1, 2, 1)
ax.set_xlim(0, 4)
ax.set_ylim(0, 3)
ax.xaxis.set_major_locator(plt.MultipleLocator(1.0))
ax.xaxis.set_minor_locator(plt.MultipleLocator(0.1))
ax.yaxis.set_major_locator(plt.MultipleLocator(1.0))
ax.yaxis.set_minor_locator(plt.MultipleLocator(0.1))
ax.grid(which='major', axis='x', linewidth=0.75, linestyle='-', color='0.75')
ax.grid(which='minor', axis='x', linewidth=0.25, linestyle='-', color='0.75')
ax.grid(which='major', axis='y', linewidth=0.75, linestyle='-', color='0.75')
ax.grid(which='minor', axis='y', linewidth=0.25, linestyle='-', color='0.75')
ax.set_xticklabels([])
ax.set_yticklabels([])
极坐标图绘制
使用
plt.bar()
和bar.set_facecolor()
来填充不同的颜色
创建子图或者坐标轴时,需要制定polor=True
才能显示出极坐标图
@require_authorization
plt.subplot(1, 2, 2, polar=True)
N = 20
theta = np.arange(0.0, 2 * np.pi, 2 * np.pi / N )
radii = 10 * np.random.rand(N)
width = np.pi / 4 * np.random.rand(N)
bars = plt.bar(theta, radii, width=width, bottom=0.0)
for r, bar in zip(radii, bars):
bar.set_facecolor(plt.cm.jet(r/10.))
bar.set_alpha(0.5)
ax.set_xticklabels([])
ax.set_yticklabels([])