通过matplotlib入门,我们已经绘制简单的图像,但是matplotlib一个非常优秀的绘图库,如果仅仅能实现上述功能,用excel就行了,不需要使用编程了。
函数式绘图的高级玩法
plot的参数传递方法
在matplotlib入门 中我们采用的方式是格式化参数的方法,我们也可以利用更加容易理解的方法传递参数。
def paramPlots():
#X,C,S是用numpy分别定义的序列,C为cos,S为sin
plt.plot(X,C,label="$cos(x)$",color="red",linewidth=2.5,linestyle="-")
plt.plot(X,S,label="$sin(x)$",color="blue",linewidth=2.5,linestyle="-")
#采用字典的方法传递参数
plt.show()
绘图区域属性设置
我们在matplotlib入门 中已经设置几个绘图对象的属性。咱们在这儿先回顾一下。
plt.title('mytitle')#设置图表标题
plt.xlabel('x axis')#设置X坐标轴标题
plt.ylabel('y axis')#设置Y坐标轴表
plt.xlim(0.0,9.0)#设置坐标轴的范围
plt.ylim(0.0,30.0)
plt.legend(loc='upper right',frameon=True)#设置图例
我们可以总结为以下这张图:
咱们先理解为,采用绘图对象的方法进行设置。在后面将详细解析其原理。除了上述属性之外,常用的还有网格属性。
#网格设置
def moreFeature():
plt.plot(X,C,label="$cos(x)$",color="red",linewidth=2.5,linestyle="-")
plt.plot(X,S,label="$sin(x)$",color="blue",linewidth=2.5,linestyle="-")
plt.grid()#网格设置
plt.show()
绘制多个子图
如果我们要实现如下效果,即多个坐标系。我们怎么实现了?
还是万能法宝,采用pyplot的方法subplot()
#绘制多个坐标系
def subPlots():
#多个坐标系
plt.subplot(221)#(行,列,序号)
plt.subplot(222)
plt.subplot(223)
plt.subplot(224)
plt.show()
其中
第一个参数:总共有多少行
第二个参数:总共有多少列
第三个参数:从做往右,从上而下。依次编号1,2,3,4
利用对象绘图
上述都是用函数式绘图,类似matlab,是面向过程的。上述函数式调用很方便,是通过封装对象实现的。本质上还是构建对象来构建图像。函数式编程将构建对象的过程封装在函数中,从而让我们觉得很方便。函数式编程创造了一个仿真MATLAB的工作环境,并有许多成形的绘图函数。如果只是作为Matplotlib的一般用户(非开发者),pyplot可以满足大部分的需求。如果是一般用户就可以就此停步了。
但是,如果需要实现复杂的功能,或者灵活操作,就必须用到对象。下面就详细解析其实现过程。
最简单实现方法
咱们可以使用下面这段程序实现上述同样的功能。
#利用对象绘图实例,同样绘制一个sin和cos图
def objectDraw1():
fig=plt.figure()#创建figure对象
ax=fig.add_subplot(111)#创建axes对象
artist1=ax.plot(X,C,label="$cos(x)$",color="red",linewidth=2.5,linestyle="-")
artist2=ax.plot(X,S,label="$sin(x)$",color="blue",linewidth=2.5,linestyle="-")
#利用axes对象的plot()方法绘制图像
print fig,ax,artist1,artist2#打印出对象名
plt.show()
并且打印出对象名。
>>> matplotlibDemo2.objectDraw1()
Figure(640x480) Axes(0.125,0.1;0.775x0.8) [<matplotlib.lines.Line2D object at 0x
03FD8110>] [<matplotlib.lines.Line2D object at 0x03FD8250>]
咱们可以看到三个对象,咱们用可以通俗化的理解为:
- figure对象:相当于一张坐标纸
- axes对象:画在坐标纸的坐标系,我们可以在一张坐标纸上画多个坐标系
- matplotlib.lines.Line2D对象:画在一个坐标系中图像,一个坐标系可以话多个图像
总结一下利用对象绘图的过程,可以分为三步:
- 创建figure对象
- 用figure对象的 add_ axes()或add_subplots()方法创建一个或者多个axes对象。
- 调用axes、subplot对象的方法创建各种类型的图像
函数式绘图的实现过程
我们之前函数式绘图采用都是隐式figure()和axes()。当我们调用plot()方法创建图像时,我们自己并没有直接在程序里创建figure和axes对象,但matplotlib会调用gca()方法获得当前axes对象,gcf()方法获得当前figure对象。如果没有的话,先创建一个figure对象,然后默认创建一个subplot(111)的axes对象。
如果不信的话,我们写个Demo试验一下:
def getCurrentObject():
ax1=plt.subplot(211)#(行,列,序号)
plt.plot(X,C,label="$cos(x)$",color="red",linewidth=2.5,linestyle="-")
myGetAxes=plt.gca()#获取当前axes
myGetFigure=plt.gcf()#获取当前figure
plt.subplot(212)
plt.plot(X,S,label="$sin(x)$",color="blue",linewidth=2.5,linestyle="-")
myGetAxes.plot([-1,1],[-1,1])
print myGetFigure,myGetAxes
plt.show()
输出结果:
>>> matplotlibDemo2.getCurrentObject()#打印出对象名
Figure(640x480) Axes(0.125,0.536364;0.775x0.363636)
咱们来分析一下程序
1、创建figure及axes对象。首先会判断有没有figure对象,判断没有,就默认进行创建。然后再创建subplot(211)
ax1=plt.subplot(211)#(行,列,序号)
2、在当前对象下绘制图像
plt.plot(X,C,label="$cos(x)$",color="red",linewidth=2.5,linestyle="-")
3、利用gcf()和gca()获取当前figure和axes
myGetAxes=plt.gca()#获取当前axes
myGetFigure=plt.gcf()#获取当前figure
4、在创建一个axes对象,并在当前对象下绘图。由于之前已经创建了一个figure对象,不用再创建。直接创建一个axes对象subplot(212),因此当前对象就成了subplot(212)。因此,sin函数图像就画在了2号子图中了
plt.subplot(212)
plt.plot(X,S,label="$sin(x)$",color="blue",linewidth=2.5,linestyle="-")
5、在我们获取的axes对象中,绘制直线。调用axes对象myGetAxes的plot()方法画一条直线。注意一下:此时图像并没有出现在2号子图中,而是出现在1号子图中。这是因为我们现在已经在对象的方法绘图,而不是函数式绘图。
myGetAxes.plot([-1,1],[-1,1])
6、打印对象名。通过打印出的对象名,我们也可以发现,gcf获得的是一个figure对象,而gca获得的是一个axes对象。
print myGetFigure,myGetAxes
#输出结果
>>> matplotlibDemo2.getCurrentObject()#打印出对象名
Figure(640x480) Axes(0.125,0.536364;0.775x0.363636)
利用对象绘制图像设置参数
通过上面的学习,我们已经进入了利用对象绘图的大门,再往进去走,你就得给你的坐标系设置各种参数了,要实现函数式绘图已经完成的功能。那就继续往下码代码。
#对象绘图,设置坐标系参数
def objectDraw2():
fig=plt.figure()#创建figure对象
ax=fig.add_subplot(111)#创建axes对象
artist1=ax.plot(X,C,label="$cos(x)$",color="red",linewidth=2.5,linestyle="-")
artist2=ax.plot(X,S,label="$sin(x)$",color="blue",linewidth=2.5,linestyle="-")
#利用axes对象的plot()方法绘制图像
#axes(坐标系)属性设置
ax.set_title("mytitle")#设置图表标题
ax.set_xlabel("x_axis")#设置x轴标题
ax.set_ylabel("y_axis")#设置y轴标题
ax.set_xlim(-4.0,4.0)#设置x轴范围
ax.set_ylim(-2.0,2.0)#设置y轴范围
ax.legend(loc='upper right',frameon=True)#设置图例
ax.grid()#设置网格
plt.show()
实现过程也极其简单,调用axes对象的方法即可。通过set_*方法和legend()及grid()很简单的实现了。
通过上面的学习,我们已经迈进了matplotlib的大门,我们已经学会了用函数式和建立对象绘图两种方法。并且比较了两者之间的不同,及其两者之间的联系。完全可以实现了excel中能实现的所有折线图的功能。但这远远不够,因为饼状图、散点图、柱状图等等我们都没还有接触到。况且matplotlib如果你认为只能实现这点功能,你就too young too simple了。在下节笔记中,我们将继续深入,继童子功之后,我们将正式开始进入刀枪剑戟等十八般武艺的学习过程。