- 采用面向对象技术来实现,组成图标的各个元素都是对象。
快速绘图
- matplotlib的pyplot模块:绘图模块
-
matplotlib——pyplot和pylab区别
对Pyplot的解说:“方便快速绘图matplotlib通过pyplot模块提供了一套和MATLAB类似的绘图API,将众多绘图对象所构成的复杂结构隐藏在这套API内部。”
对pylab的解说:“matplotlib还提供了一个名为pylab的模块,其中包括了许多NumPy和pyplot模块中常用的函数,方便用户快速进行计算和绘图,十分适合在IPython交互式环境中使用。”
(pylab combines pyplot with numpy into a single namespace. This is convenient for interactive work, but for programming it is recommended that the namespaces be kept separate)
- 以面向对象的方式绘图
plt.gcf():得到当前的图表(Figure对象)
plt.gca():得到当前的子图(Axes对象)
- 配置属性
根据返回的对象获取或者设置对应的属性。
getp()和setp(),get_*()和set_*()
面向对象的绘图库。
- 绘制多个子图()
import numpy as np
import matplotlib.pyplot as plt
plt.figure(1)
plt.figure(2)
ax1 = plt.subplot(211)
ax2 = plt.subplot(212)
x = np.linspace(0,3,100)
for i in xrange(5):
#切换图表
plt.figure(1)
plt.plot(x,np.sin(i*x/3))
#切换子图
plt.sca(ax1)
plt.plot(x,np.sin(i*x))
plt.sca(ax2)
plt.plot(x,np.cos(i*x))
plt.show()
- 配置文件
修改默认样式。(matplotlibrc文件)
将文件中的默认配置保持到rcParams变量,之后使用rcParams变量中的配置进行绘图。可以直接修改rcParams变量。
- 图表中显示中文
1.程序中直接指定字体
2.程序开头修改配置字典rcParams
3.修改配置文件
Artist对象
- Artist对象的属性
Artist对象氛围简单对象和容器对象
- Figure容器(最上层)
AxesSubplot 是Axes的派生类
- Axes对象
- Axis对象
- Axis对象的关系
坐标变换和注释
- 了解matplotlib中坐标转换的原理
- 4种坐标系
数据坐标系
如:Axes对象的transData属性
子图坐标系
如:Axes对象的transAxes属性
图表坐标系
如:Figure对象的transFigure属性
窗口坐标系
上述坐标变换对象的transform()方法,可以将此坐标系下的坐标转换为窗口坐标系中的坐标。
- 坐标变换的步骤
- 图表坐标的变换对象transFigure
仿射变换
>>fig.transFigure >> BboxTransformTo( #将矩形区域(0,0)-(1,1)变换为(0,0)-(480,320)的坐标变换 TransformedBbox( Bbox([[0.0, 0.0], [6.0, 4.0]]), Affine2D(array([[ 80., 0., 0.], [ 0., 80., 0.], [ 0., 0., 1.]])) ) )
- 子图坐标变换对象
>>ax.transAxes >> BboxTransformTo(#将矩形区域(0,0)-(1,1)变换为(0,0)-(480,320)的坐标变换 TransformedBbox( Bbox([[0.125, 0.125], [0.9, 0.88]]), BboxTransformTo( #将矩形区域(0.125,0.125)-(0.9,0.88)变换为...的坐标变换 TransformedBbox( Bbox([[0.0, 0.0], [6.0, 4.0]]), Affine2D(array([[ 72., 0., 0.], [ 0., 72., 0.], [ 0., 0., 1.]]) ) ) ) ) )
- 数据坐标系ax.transData
由ax.transScal(尺度变换,对数坐标系,线性坐标系等),ax.transLimits,ax.transAxes组成。
>>ax.transLimits >> BboxTransformFrom(#将矩形区域变换为(0,0)-(1,1) TransformedBbox( Bbox([[-0.105848707599, -0.223782293619], [3.1478975575, 6.29637058541]]), TransformWrapper( BlendedAffine2D(IdentityTransform(), IdentityTransform()) ) ) )
- 制作阴影效果
连续绘制多条透明度和偏移量逐渐变化的的曲线。
import numpy as np import matplotlib.pyplot as plt import matplotlib.transforms as transforms x = np.arange(0,2,0.01) y = np.sin(2*np.pi*x) N = 7 for i in xrange(N,0,-1): offset = transforms.ScaledTranslation(i,-i,transforms.IdentityTransform()) shadow_trans = plt.gca().transData+offset plt.plot(x,y,linewidth = 4, color = "black", transform = shadow_trans, alpha = (N-i)/2.0/N) plt.plot(x,y,linewidth = 4,color="black") plt.ylim(-1.5,1.5) plt.show()
- 添加注释
在数据坐标系,子图坐标系和图标坐标系添加文字
import numpy as np import matplotlib.pyplot as plt from matplotlib.font_manager import fontManager x = np.linspace(-1,1,10) y = x**2 fig = plt.figure(figsize = (8,4)) ax = plt.subplot(111) plt.rcParams['font.family'] = "SimHei" plt.plot(x,y) for i,(_x,_y) in enumerate(zip(x,y)):#数据坐标系 plt.text(_x,_y,str(i),color = 'red',fontsize = 1+10) plt.text(0.5,0.8,u"子图坐标系文字",color = 'blue',ha = 'center', transform=ax.transAxes)#子图坐标系 plt.figtext(0.1,0.9,u'图标坐标系文字',color = 'green')#图表坐标系 plt.show()
绘图函数
- 对数坐标系
semilogx(), semilogy(), loglog()。分别绘制x轴为对数坐标系,y轴为对数坐标系,两轴都为对数坐标系的图表。
import numpy as np import matplotlib.pyplot as plt w = np.linspace(0.1,1000,1000) p = np.abs(1/(1+0.1j*w)) plt.subplot(221) plt.plot(w,p,linewidth = 2) plt.ylim(0,1.5) plt.subplot(222) plt.semilogx(w,p,linewidth = 2) plt.ylim(0,1.5) plt.subplot(223) plt.semilogy(w,p,linewidth = 2) plt.ylim(0,1.5) plt.subplot(224) plt.loglog(w,p,linewidth = 2) plt.ylim(0,1.5) plt.show()
- 极坐标
通过设置polar参数创建极坐标子图,或者使用polar()直接创建极坐标子图并绘制曲线。
- 柱状图
bar()来绘制。
- 散列图
scatter()函数
- 图像
- 等值线图
- contour()和contourf()(带填充效果)
import numpy as np import matplotlib.pyplot as plt y,x = np.ogrid[-2:2:200j,-3:3:300j] z = x*np.exp(-x**2-y**2) extent = [np.min(x),np.max(x),np.min(y),np.max(y)] plt.figure(figsize=(10,4)) plt.subplot(121) cs = plt.contour(z,10,extent = extent)#10个区间 plt.clabel(cs)#为等值线标上对应的值 plt.subplot(122) plt.contourf(x.reshape(-1),y.reshape(-1),z,20) plt.show()
- 绘制隐函数
import numpy as np import matplotlib.pyplot as plt y,x = np.ogrid[-1.5:1.5:200j,-1.5:1.5:200j] f = (x**2+y**2)**4-(x**2-y**2)**2 extent = [np.min(x),np.max(x),np.min(y),np.max(y)] plt.figure(figsize=(9,4)) plt.subplot(121) cs = plt.contour(f,extent = extent,level = [0,0.1], colors = ["b","r"],linestyles = ["solid","dashed"],linewidth = [2,2])#两条等高线以及对应的属性 plt.clabel(cs)#为等值线标上对应的值 plt.subplot(122) for c in cs.collections: data = c.get_paths()[0].vertices plt.plot(data[:,0],data[:,1], color = c.get_color()[0],linewidth = c.get_linewidth()[0]) plt.show()
- 三维曲线
使用matplotlib的二维绘图的功能来实现三维图形的绘制,作业绘图速度有限。