机器学习笔记(二):matplotlib基础

来源:互联网 发布:淘宝优惠券怎么成代理 编辑:程序博客网 时间:2024/05/17 03:22

通过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 0x03FD8110>] [<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()#获取当前axesmyGetFigure=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了。在下节笔记中,我们将继续深入,继童子功之后,我们将正式开始进入刀枪剑戟等十八般武艺的学习过程。

0 0
原创粉丝点击