这个教程包含了些基础的用法示例和练习,可以帮助您很快熟悉Matplotlib。 importmatplotlibasmpl importmatplotlib。pyplotasplt importnumpyasnp一个简单示例 Matplotlib将您的数据绘制在Figures(画布)上,每一张画布上可以包含一个或多个Axes(坐标系,您可以把坐标(x,y)显示在Axes中,极坐标中的(theta,r),3D坐标的(x,y,z)等)。创建带坐标系的图形的最简单的方法是使作pyplot。subplots(),然后就可以用Axes。plot()方法来在坐标轴上绘制数据。 fig,axplt。subplots()创建一张画布,上面有一个坐标系 ax。plot(〔1,2,3,4〕,〔1,4,2,3〕)往坐标系上绘制数据 〔matplotlib。lines。Line2Dat0xffff91a037f0〕 png Figure的结构 Figure统筹了所有的子坐标系,那是一组特殊的Artists(包含标题、图例、色条等),甚至嵌套的subfigures。创建新Figure最简单的方法是用pyplot,如: fig1plt。figure()一个没有坐标系的空画布,不显示 fig2,axplt。subplots()包含一个坐标系的画布 fig3,axsplt。subplots(2,2)包含22坐标系阵列的画布 png png 将轴与图形一起创建是很方便,但可能不够灵活,您也可以后期手动添加坐标系,要注意,很多Matplotlib后端支持缩放和平移。Axes Axes坐标系,可以把它当成一个Artist(画家,我感觉画纸可能更贴切一些),把他绑定到画板(Figure)上,它包含一个可以画图的区域,一般包含2个(3D图的话是3个)Axis(数轴)对象,Axis对象(注意和Axes对象区别,一个是数轴,一个是坐标系)提供了ticks和ticklabels来显示坐标轴的刻度,每个Axes坐标系也有一个title(通过settitle()方法来设置),一个xlabel(通过setxlabel()设置),一个ylabel(通过setylabel()方法来设置)。 Axes类及其成员函数是使用OOP接口的主要入口,里面定义了大多数的绘图方法,比如ax。plot()Axis Axis对象设置比例尺和数值范围,生成标记(ticks,轴上的记号)和标记名(ticklabels,标记记号的字符串),记号的位置由Locator对象确定,标记名字符串由Formatter格式化。正确地组合使用Locator和Formatter可以精准控制刻度位置和标签。Artist基本上,Figure上所有的可见对象都是Aritst(甚至Figure,Axes,Axis对象也是),主要包括Text对象,Line2D对象,collections对象,Patch对象等,当Figure开始渲染时,所有的Aritst都被绘制到Axes上,这些Artist不能被其他坐标系共享,也不能从一个坐标系移动到另一个。输入绘图函数的参数类型 绘图函数需要numpy。array或者numpy。ma。maskedarray作为输入参数,或者可以传入numpy。asarray的参数,类似数组的类,如pandas数据对象和numpy。matrix对象可能无法按预期工作。常用的作法是绘图前将它们转换成numpy。array对象,比如转化成mumpy。matrix bnp。matrix(〔〔1,2〕,〔3,4〕〕) basarraynp。asarray(b) 大多数的对象也会解析一个可寻址对象,比如dict,numpy。recarray,pandas。DataFrame。Matplotlib允许您提供数据关键字参数并生成对应于x和y变量的字符串的图象 np。random。seed(19680801) data{a:np。arange(50), c:np。random。randint(0,50,50), d:np。random。randn(50)} data〔b〕data〔a〕10np。random。randn(50) data〔d〕np。abs(data〔d〕)100 fig,axplt。subplots(figsize(5,2。7),layoutconstrained) ax。scatter(a,b,cc,sd,datadata) ax。setxlabel(entrya) ax。setylabel(entryb) Text(0,0。5,entryb) png编码样式显式和隐式接口 如上所述,有两种方法可以使用Matplotlib1。显式创建Figures和Axes,并调用它们的方法(面向对象的方法)。2。依靠pyplot隐式创建和管理Figures和Axes,并使用pyplot的函数进行绘图。 面向对象方法的例子 xnp。linspace(0,2,100)Sampledata。 注意,即使是面向对象的风格,我们也用matplotlib。pyplot。figure来创建Figure fig,axplt。subplots(figsize(5,2。7),layoutconstrained) ax。plot(x,x,labellinear)往坐标轴上画数据。 ax。plot(x,x2,labelquadratic)。。。 ax。plot(x,x3,labelcubic)。。。。 ax。setxlabel(xlabel)设置X轴标记。 ax。setylabel(ylabel)设置Y轴标记。 ax。settitle(SimplePlot)设置坐标轴标题。 ax。legend()增加图例。 matplotlib。legend。Legendat0xffff8de910f0 png pyplot的例子 xnp。linspace(0,2,100) plt。figure(figsize(5,2。7),layoutconstrained) plt。plot(x,x,labellinear) plt。plot(x,x2,labelquadratic) plt。plot(x,x3,labelcubic) plt。xlabel(xlabel) plt。ylabel(ylabel) plt。title(simpleplot) plt。legend() matplotlib。legend。Legendat0xffff8de1fe80 png Matplotlib的文档和示例同时使用面向对象的OO和pyplot样式。一般来说,我们建议使用OO风格,尤其是对于复杂的绘图以及打算作为大型项目的一部分重用的函数和脚本。然而,pyplot样式对于快速交互工作非常方便。大家可以根据实践需要来选择。代码复用 如果您需要使用不同的数据集反复绘制相同的绘图,或者想要轻松包装Matplotlib的方法,可以使用下面的自定义函数 defmyplotter(ax,data1,data2,paramdict): outax。plot(data1,data2,paramdict) returnout 例如: data1,data2,data3,data4np。random。randn(4,100)make4randomdatasets fig,(ax1,ax2)plt。subplots(1,2,figsize(5,2。7)) myplotter(ax1,data1,data2,{marker:x}) myplotter(ax2,data3,data4,{marker:o}) 〔matplotlib。lines。Line2Dat0xffff8dd0a1d0〕 png 大多数的绘图方法都有样式选项,这些选项可以在调用plotting方法时调用,或者在Artist中的setter中访问。在下边的绘图中,我们手动设置颜色、线宽、和线的样式,然后使用setlifestyle设置第二行的线条样式。 fig,axplt。subplots(figsize(5,2。7)) xnp。arange(len(data1)) ax。plot(x,np。cumsum(data1),colorblue,linewidth3,linestyle) l,ax。plot(x,np。cumsum(data2),colororange,linewidth2) l。setlinestyle(:) png Matplotlib有一个非常灵活的颜色阵列,大多数艺术家都接受它;有关规格列表,请参阅颜色教程。有些艺术家会采用多种颜色。即对于散点图,标记的边缘可以是与内部不同的颜色: fig,axplt。subplots(figsize(5,2。7)) ax。scatter(data1,data2,s50,facecolorC0,edgecolork) matplotlib。collections。PathCollectionat0xffff8dc0e048 png线宽、线型和标记 Matplotlib的线宽用印刷点来表示(1pt172英寸),可用于描边,类拟地,描边线可以具有自己的线条样式。 Markersize标记的大小取决与所使用的方法,plot以点为单位指定标记的大小,一般来说是Marker的直径或宽度。 scatter指定标记大小与标记的可视区域大致成比例。 一些常用的标记样式Matplotlib已将其设置为字符串代码,当然,用户也可以自定义自已的标记样式。 fig,axplt。subplots(figsize(5,2。7)) ax。plot(data1,o,labeldata1) ax。plot(data2,d,labeldata2) ax。plot(data3,v,labeldata3) ax。plot(data4,s,labeldata4) ax。legend() matplotlib。legend。Legendat0xffff8dc45ba8 png给图贴标签Axes的标签和文本 setxlabel、setylabel和settitle用于在指定位置添加文本。也可以使用文本将文本直接添加到绘图中: mu,sigma115,15 xmusigmanp。random。randn(10000) fig,axplt。subplots(figsize(5,2。7),layoutconstrained) 柱状图的数据 n,bins,patchesax。hist(x,50,densityTrue,facecolorC0,alpha0。75) ax。setxlabel(Length) ax。setylabel(probability) ax。settitle(Aardvarklengths(notreally)) ax。text(75,。025,rmu115,sigma1539;) ax。axis(〔55,175,0,0。03〕) (55。0,175。0,0。0,0。03) png 所有的text函数返回一个matplotlib。text。Text实例,您也可以通过向text函数中传入关键字参数来自定义特性。 tax。setxlabel(mydata,fontsize14,colorred)在文本中使作数学表达式 Matplotlib接受Tex方程表达式。如: ax。settitle(rsigmai1539;) Text(0。5,1。0,sigmai1539;) 我们还可以给绘图填加注释 fig,axplt。subplots(figsize(5,2。7)) tnp。arange(0。0,5。0,0。01) snp。cos(2np。pit) line,ax。plot(t,s,lw2) ax。annotate(localmax, xy(2,1), xytext(3,2), arrowpropsdict(facecolorblack,shrink0。05)) xy是箭头指向的图中的数据点 xytext是文本开始的数据点,也是箭尾指向的数据点 ax。setylim(2,2) (2。0,2。0) png 有时,为了便于用户理解,我们常常给图加上图例。 fig,axplt。subplots(figsize(5,2。7)) ax。plot(np。arange(len(data1)),data1,labeldata1) ax。plot(np。arange(len(data2)),data2,labeldata2) ax。plot(np。arange(len(data3)),data3,d,labeldata3) ax。legend() matplotlib。legend。Legendat0xffff8d9ab630 png坐标系风格和标尺 每一个坐标系Axis都有两个或三个数轴(Axis)对象对应x轴和y轴(以及z轴),它们控制了Axis的风格,标尺的位置和标尺的格式。 除了线性比例,Matplotlib还提供了非线性比例,比如对数比例,如loglog,semilogx,semilogy。这里我们手动设一下比例尺。 fig,axsplt。subplots(1,2,figsize(5,2。7),layoutconstrained) xdatanp。arange(len(data1))makeanordinalforthis data10data1 axs〔0〕。plot(xdata,data) axs〔1〕。setyscale(log) axs〔1〕。plot(xdata,data) 〔matplotlib。lines。Line2Dat0xffff8d8eb8d0〕 png fig,axsplt。subplots(2,1,layoutconstrained) axs〔0〕。plot(xdata,data1) axs〔0〕。settitle(Automaticticks) axs〔1〕。plot(xdata,data1) axs〔1〕。setxticks(np。arange(0,100,30),〔zero,30,sixty,90〕)第一个是ticket,第二个是label,前后一一对应的关系 axs〔1〕。setyticks(〔1。5,0,1。5〕)notethatwedontneedtospecifylabels axs〔1〕。settitle(Manualticks) Text(0。5,1。0,Manualticks) png日期字符串 Matplotlib可以处理日期数组、字符串数组以及浮点数的绘制。它们会根据需要获得特殊的标尺和标签。对于日期: fig,axplt。subplots(figsize(5,2。7),layoutconstrained) datesnp。arange(np。datetime64(20211115),np。datetime64(20211225), np。timedelta64(1,h)) datanp。cumsum(np。random。randn(len(dates))) ax。plot(dates,data) cdfmpl。dates。ConciseDateFormatter(ax。xaxis。getmajorlocator()) ax。xaxis。setmajorformatter(cdf) png 关于分类绘图需要注意的一点是,某些分析文本文件的方法会返回字符串列表,即使字符串都表示数字或日期。如果您传递1000个字符串,Matplotlib将认为您是指1000个类别,并将为您的绘图添加1000个刻度!一些其他的轴对像 在一个图表中绘制不同单位或大小的数据可能需要额外的y轴。这种情况可以通过使用twinx添加一个新的轴来创建,该轴具有一个不可见的x轴和一个位于右侧的y轴(类似于twiny)。如图: fig,(ax1,ax3)plt。subplots(1,2,figsize(7,2。7),layoutconstrained) l1,ax1。plot(t,s) ax2ax1。twinx() l2,ax2。plot(t,range(len(t)),C1) ax2。legend(〔l1,l2〕,〔Sine(left),Straight(right)〕) ax3。plot(t,s) ax3。setxlabel(Angle〔rad〕) ax4ax3。secondaryxaxis(top,functions(np。rad2deg,np。deg2rad)) ax4。setxlabel(Angle〔〕) Text(0。5,0,Angle〔〕) png 有时候我们想在二维图中表现三维的信息,我们希望在一个由颜色图中的颜色表示的绘图中有一个第三维度。Matplotlib有许多绘图类型可以做到这一点: X,Ynp。meshgrid(np。linspace(3,3,128),np。linspace(3,3,128)) Z(1X2X5Y3)np。exp(X2Y2) fig,axsplt。subplots(2,2,layoutconstrained) pcaxs〔0,0〕。pcolormesh(X,Y,Z,vmin1,vmax1,cmapRdBur) fig。colorbar(pc,axaxs〔0,0〕) axs〔0,0〕。settitle(pcolormesh()) coaxs〔0,1〕。contourf(X,Y,Z,levelsnp。linspace(1。25,1。25,11)) fig。colorbar(co,axaxs〔0,1〕) axs〔0,1〕。settitle(contourf()) pcaxs〔1,0〕。imshow(Z2100,cmapplasma, normmpl。colors。LogNorm(vmin0。01,vmax100)) fig。colorbar(pc,axaxs〔1,0〕,extendboth) axs〔1,0〕。settitle(imshow()withLogNorm()) pcaxs〔1,1〕。scatter(data1,data2,cdata3,cmapRdBur) fig。colorbar(pc,axaxs〔1,1〕,extendboth) axs〔1,1〕。settitle(scatter()) Text(0。5,1。0,scatter()) png多画板和多轴模式 您可以使用figplt。figure()或者fig2,axplt。subplots()方法打开多个画板(Figures),在保留对象引用的前提下,您可以向任一画板添加画家(Artists)。 您可以通过多种方法来添加坐标系,但最基础的方法还是上面用过的plt。subplots(),要想实现更复杂的布局,如跨行列的布局,可以用subplotmosaic()方法。 fig,axdplt。subplotmosaic(〔〔upleft,right〕,〔lowleft,right〕〕, layoutconstrained) axd〔upleft〕。settitle(upleft) axd〔lowleft〕。settitle(lowleft) axd〔right〕。settitle(right) Text(0。5,1。0,right) png