当前位置: 首页 > 后端技术 > Python

matplotlib面向对象绘图小白最终版

时间:2023-03-25 21:32:20 Python

0.前面写过,我认为matplotlib中还是推荐面向对象的方法,因为它可以更好的控制和自定义绘图。首先,我会送你一个宝贝。这是我从matplotlib的官方文档中挑选出来的。谢谢你把它拿走。这张图展示了大部分的绘图元素:1.先看Matplotlib、pyplot和pylab的关系(ai)互(hen)关(qing)部(chou)——这个词条摘自官方文档Matplotlib是整个packagematplotlib.pyplot是matplotlib中的一个模块;pylab是随matplotlib安装的模块。Pyplot为底层面向对象的绘图库提供了一个状态机接口。状态机隐式自动创建图形和坐标轴以实现所需的图形,例如:x=np.linspace(0,2,100)plt.plot(x,x,label='linear')plt.plot(x,x**2,label='quadratic')plt.plot(x,x**3,label='cubic')plt.xlabel('xlabel')plt.ylabel('ylabel')plt.title("SimplePlot")plt.legend()plt.show()第一次调用plt.plot将自动创建必要的图形和坐标轴以实现所需的绘图。随后调用plt.plot重新使用当前轴,并每次添加另一行。设置标题、图例和轴标签也会自动使用当前轴并分别设置标题、图例和轴标签。pylab是一个方便的模块,相当于在单个命名空间中批量导入matplotlib.pyplot(用于绘图)和numpy(用于数学和使用数组)。但是,由于命名空间污染,pylab已被弃用并强烈建议不要使用。请改用pyplot。2、matplotlib绘图对象的感性理解参考:https://finthon.com/matplotli...2.1。简介Matplotlib中的大对象主要分为三个,FigureCanvas(画布,画布层),Figure(图形,图像层),Axes(坐标轴,绘制区域-轴区域,坐标层)(概念划分参考:https://www.cnblogs.com/dajun...)和FigureCanvas(画布)涉及到底层操作,我们可以说使用matplotlib来画图,一个很基础的问题就是搞清楚图的两个对象(图像层)和坐标轴(坐标层)。只有真正理解这两个概念,才能掌握整个绘图过程。2.2.Figureobjectimportmatplotlib.pyplotaspltplt.figure()plt.show()使用plt.figure()创建一个Figure对象,通过plt.show()显示出来:运行一下看看:空,什么都没有,你懂的2.3.axes对象有一个图像层,然后在图像层上绘制,所以我们首先要创建一个坐标轴,我们可以调用Figure实例的add_axes方法:fig=plt.figure()ax=fig.add_axes([0.1,0.1,0.8,0.8])#[距离左边、底部、坐标轴宽度、坐标轴高度]range(0,1)plt.show()[0.1,0.1,0.8,0.8]表示在图像层中,坐标轴区域(坐标层)距画布左侧0.1倍距离,距底部0.1倍距离。这两个位置确定后,坐标轴的整体宽高占0.8倍的大小,也就是从右边到顶部的0.9(0.1+0.8)倍。得到以下结果:2.4.自动创建对象如果你之前接触过一些绘图命令,你会发现:plt.plot([0,1,2])plt.show()直接用这两个命令来绘图呀,画布和坐标轴是未定义,得到如下图:这是因为matplotlib会在最近使用的坐标图层上绘制。如果没有,默认会创建一个图形对象(图像层)和坐标轴(坐标层))。但是创建图形对象(图像层)和坐标轴(坐标层)的好处是我们对绘制过程有完全的控制权(比如可以指定在哪里绘制),绘制的逻辑性更强。接下来,我们画个图来理解这个过程:importnumpyasnpiimportmatplotlib.pyplotaspltx=np.linspace(0,10,10)y=np.sin(x)#createcanvasfig=plt.figure()#创建坐标轴ax1=fig.add_axes([0.1,0.1,0.8,0.8])#第一个坐标轴的范围ax2=fig.add_axes([0.2,0.5,0.4,0.3])#第二个坐标轴rangeax1.plot(x,y,'r')ax2.plot(x,y,'g')plt.show()我们得到下图:这里我们创建了两个坐标轴ax1和ax2,指定范围为两个坐标图层并绘制图2.5。图片大小在创建Figure对象时,我们可以通过figsize和dpi来控制图片大小。例如:fig=plt.figure(figsize=(16,8),dpi=100)figsize表示画布的纵横比;dpi表示每英寸的像素值。所以上面的命令创建了一个1600*800像素的画布。2.5.保存图片从上面的输出结果来看,plt.show()输出的不是图片,而是一个交互式的绘图界面。如果要保存图片,还需要通过savefig()进行保存。在不显式指定画布和坐标轴的情况下,也可以直接使用plt.savefig()进行保存,即显式表示图形对象(绘图层)可以使用Figure实例的方法fig.savefig()。matplotlib可以生成各种格式的高质量图片,包括PNG、JPG、EPS、SVG、PGF和PDF,只要写上后缀:fig.savefig("result.png")2.6。绘制方法:先创建画布,再创建坐标轴,最后在坐标轴上绘制。这种代码方式将使绘图逻辑更加清晰,您可以随意修改图片的每个部分。3.matplotlib3.1中的子图对象AxesSubplot。先看示例代码:importmatplotlib.pyplotaspltimportnumpyasnpx=np.arange(1,10,1)y=np.random.randn(len(x))fig=plt.figure()#生成一个canvasax=fig.add_subplot(111)#在画布上创建子图ax.plot(x,y)ax.set_title("objectoriented")#设置子图标题plt.show()听中文名字感觉它,子画面?我必须添加坐标图层才能绘制吗?现在只需创建子图画布:importmatplotlib.pyplotaspltimportnumpyasnpx=np.arange(1,100,1)fig=plt.figure()ax1=fig.add_subplot(211)plt.show()我们可以看到,我们没有给子图添加坐标层,而是显示坐标,这和我们之前直接显示的plt.figure()不同。再看一下子图的“英文名”——AxesSubplot,你明白了吗?[手动滑稽]是的,这个支线是自带绘图层的。如果你明白这一点,那么ojbk。(一行两列),全部显示importmatplotlib.pyplotaspltimportnumpyasnpx=np.arange(1,100,1)fig=plt.figure()ax1=fig.add_subplot(121)ax1.plot(x,x)ax2=fig.add_subplot(122)ax2.plot(x,x*x)plt.show()这里可以简单的对比一下pyplot的绘图方法:importmatplotlib.pyplotaspltimportnumpyasnpx=np.arange(1,100,1)plt.subplot(121)plt.plot(x,x)plt.subplot(122)plt.plot(x,x*x)plt.show()就不解释了,大家看得懂8,这里还需要解释一下plt.subplot()和fig.add_subplot()的参数含义。如果参数传入231和535,显然不匹配。如果使用plt.subplot(),则只会显示后者。如果你使用无花果。add_subplot()会显示,但可能会重叠,显然后者是3.3以上的。添加网格importmatplotlib.pyplotaspltimportnumpyasnpx=np.arange(1,10)fig=plt.figure()ax=fig.add_subplot(111)ax.plot(x,x*2)ax.grid(color='g',linestyle='--')plt.show()要知道,这个ax.grid()对应plt.grid()3.4。显示图例importmatplotlib.pyplotaspltimportnumpyasnpx=np.arange(1,11)fig=plt.figure()ax=fig.add_subplot(111)ax.plot(x,x,labell='inlinelabel')ax.legend()plt.show()同理,ax.legend()对应plt.legend()以上参考来自(已删):https://zhuanlan.zhihu。com/p/...3.5。其他比较AxesSubplot方法pyplot方法ax.set_title()plt.title()ax.set_xlabel()plt.xlabel()ax.set_ylabel()plt.ylabel()ax.set_xlim()plt.xlim()ax.set_ylim()plt.ylim()先这样吧,困了……