Matplotlib的本质是基于对象的,我们从下面这幅图开始介绍Matplotlib的各种重要的对象。 Matplotlib绘图的主要构成部分 这张图当然可以使用Matplotlib代码绘制出来,我将在文章的结尾处放出绘图的源代码,以便大家对照源代码理解绘图中的各种对象。大家也可以自己去官方文档中搜索关键词Anatomy下载。当然,这张图的具体绘制方法不是这里的重点。我们关注的是这张绘图中的各个对象图中用蓝色字体和黑色圆圈标出来的部分。下面为大家一一介绍:Figure Figure即图形,指的是整个绘图,大家能看到的所有部分都属于Figure。创建新图形最简单的方法是使用pyplot:figplt。figure()创建一个空图fig,axplt。subplots()创建带有一个Axes的图形fig,axsplt。subplots(2,2)创建一个带有2x2网格Axes的图形 如果增加一句plt。show()(大家别忘了导入模块)就可以显示出这三张图形来。其中第一句代码生成的图片就是一张白板,什么内容都没有;第二句代码生成的是一个带有坐标系的空图;第三句代码则会生成一个呈网格状分布的由四个坐标系组成的空图。下面附上的是第三张图。 22网格的Axes组成的空绘图 一般情况下,我们使用第二句或第三句在实例化一个Figure对象的同时创建一个Axes。但也可以使用第一句创建一个空的Figure,然后使用类似于下面的代码手动生成Axes(Axes到底是什么?相信你一定会问):axfig。subplots()Axes 我们在上一段已经提到了Axes,但没有深入解释它。需要特别注意的是这里的Axes并不是Axis的复数形式(吐槽一下使用Axes名称的Matplotlib设计师),而是Figure上一个由两个(x轴、y轴)坐标轴(包括坐标轴在内)围成的可供绘制数据的区域,我们可以将它称为轴域。一张图就是一个Figure,但一个Figure可以有一个或多个轴域,就像上面附的图上就有四个轴域。每个Axes都有一个标题(通过settitle()设置,默认为None)、一个x轴标签(通过setxlabel()设置)以及一个y轴标签(通过setxlabel()设置)。 Axes类及其成员函数是使用面向对象接口的主要入口点,Matplotlib在其上定义了大多数绘图方法(例如我们前一篇介绍Matplotlib面向对象的代码风格时用到的ax。plot()方法)。 注意:如果是3D图的话,那么每个轴域则是由三个坐标系围成的绘图区域构成。Axis Axis就是坐标轴。在Matplotlib的2D绘图中,每个Axes都有两个平行的同类型轴(比如上下两个水平的x轴,左右两个垂直的y轴,极坐标等非常规图除外),它们刚好围成一个矩形区域。默认情况下,左边的y轴和下边的x轴都带有数字(其实是个字符串)刻度标签(ticklabel)和刻度(tick);而上边的x轴和右边的y轴则只有一根光凸凸的线。这根光凸凸的线就是所谓的Spines,轴脊线。刻度标签和刻度都有主标签刻度(Major)和次标签刻度(Minor)之分,通常主标签刻度要突出一些。组成Axis的这些刻度(实际上是Line2D对象)和标签(实际上是Text对象)本身也是对象,也可以进行单独的设置。Artist 直译的话,可以叫作艺术家。Matplotlib把画布(canvas,这是一个底层概念,涉及到它的地方不多)想像成一个舞台,所有在这个舞台上展示自我的都被形象的称作艺术家Artist,比如文本对象Text、2D曲线对象Line2D(图上用蓝色Line文字示出的就是两个2D曲线对象)等。Artist的范围非常广泛,甚至包括我们前面提到的三种对象(Figure、Axes、Axis)。后面专门讲一讲它。 现在组成图中还有三个对象没介绍,它们分别是:Legend图例、Grid网格线和Markers点标记。网格线比较简单,不单独说了;点标记的边线和中间区域可以使用不同的颜色;Legend的设置比较丰富,后面争取专门介绍。小结 Artist对象包括了所有在我们的绘图舞台上展示各种造型的所有对象。Figure就是整个图形,它包括一个或多个Axes对象。Axes对象则包括多个Axis对象,而我们在绘图过程中打交道最多的可能就是Axes对象。在后面的介绍中我们将会了解到Figure、Axes和Axis实际上都是一类容器对象。 Matplotlib绘图中的最主要对象就是这些。那么今天的内容就到这里为止,最后附上文章开头的那个组成图的绘图代码:importnumpyasnpimportmatplotlib。pyplotaspltfrommatplotlib。tickerimportAutoMinorLocator,MultipleLocator,FuncFormatternp。random。seed(19680801)Xnp。linspace(0。5,3。5,100)Y13np。cos(X)Y21np。cos(1X0。75)2Y3np。random。uniform(Y1,Y2,len(X))figplt。figure(figsize(8,8))axfig。addsubplot(1,1,1,aspect1)defminortick(x,pos):ifnotx1。0:returnreturn。2fxax。xaxis。setmajorlocator(MultipleLocator(1。000))ax。xaxis。setminorlocator(AutoMinorLocator(4))ax。yaxis。setmajorlocator(MultipleLocator(1。000))ax。yaxis。setminorlocator(AutoMinorLocator(4))ax。xaxis。setminorformatter(FuncFormatter(minortick))ax。setxlim(0,4)ax。setylim(0,4)ax。tickparams(whichmajor,width1。0)ax。tickparams(whichmajor,length10)ax。tickparams(whichminor,width1。0,labelsize10)ax。tickparams(whichminor,length5,labelsize10,labelcolor0。25)ax。grid(linestyle,linewidth0。5,color。25,zorder10)ax。plot(X,Y1,c(0。25,0。25,1。00),lw2,labelBluesignal,zorder10)ax。plot(X,Y2,c(1。00,0。25,0。25),lw2,labelRedsignal)ax。plot(X,Y3,linewidth0,markero,markerfacecolorw,markeredgecolork)ax。settitle(Anatomyofafigure,fontsize20,verticalalignmentbottom)ax。setxlabel(Xaxislabel)ax。setylabel(Yaxislabel)ax。legend(loc1)defcircle(x,y,radius0。15):frommatplotlib。patchesimportCirclefrommatplotlib。patheffectsimportwithStrokecircleCircle((x,y),radius,cliponFalse,zorder10,linewidth1,edgecolorblack,facecolor(0,0,0,。0125),patheffects〔withStroke(linewidth5,foregroundw)〕)ax。addartist(circle)deftext(x,y,text):ax。text(x,y,text,backgroundcolorwhite,hacenter,vatop,weightbold,colorblue)Minortickcircle(0。50,0。10)text(0。50,0。32,Minorticklabel)Majortickcircle(0。03,4。00)text(0。03,3。80,Majortick)Minortickcircle(0。00,3。50)text(0。00,3。30,Minortick)Majorticklabelcircle(0。15,3。00)text(0。15,2。80,Majorticklabel)XLabelcircle(1。80,0。27)text(1。80,0。45,Xaxislabel)YLabelcircle(0。27,1。80)text(0。27,1。6,Yaxislabel)Titlecircle(1。60,4。13)text(1。60,3。93,Title)Blueplotcircle(1。75,2。80)text(1。75,2。60,Line(lineplot))Redplotcircle(1。20,0。60)text(1。20,0。40,Line(lineplot))Scatterplotcircle(3。20,1。75)text(3。20,1。55,Markers(scatterplot))Gridcircle(3。00,3。00)text(3。00,2。80,Grid)Legendcircle(3。70,3。80)text(3。70,3。60,Legend)Axescircle(0。5,0。5)text(0。5,0。3,Axes)Figurecircle(0。3,0。65)text(0。3,0。45,Figure)colorblueax。annotate(Spines,xy(4。0,0。35),xycoordsdata,xytext(3。3,0。5),textcoordsdata,weightbold,colorcolor,arrowpropsdict(arrowstyle,connectionstylearc3,colorcolor))ax。annotate(,xy(3。15,0。0),xycoordsdata,xytext(3。45,0。45),textcoordsdata,weightbold,colorcolor,arrowpropsdict(arrowstyle,connectionstylearc3,colorcolor))ax。text(4。0,0。4,Madewithhttp:matplotlib。org,fontsize10,haright,color。5)plt。show()