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

一篇文章搞定Matplotlib的所有例子丨推荐收藏

时间:2023-03-26 19:31:12 Python

摘要:Matplotlib是Python的绘图库。它可以与NumPy一起使用。Matplotlib也是深度学习常用的绘图库。主要是把训练的结果图形化,因为这样更直观,也更容易发现训练中的问题。本文分享自华为云社区《深度学习基础之matplotlib,一文搞定各个示例,建议收藏以后参考丨【百变AI秀】》,作者:香菜聊天游戏。Matplotlib是Python的绘图库。它可以与NumPy一起使用。Matplotlib也是深度学习常用的绘图库。主要是把训练的结果图形化,因为这样更直观,也更容易发现训练中的问题。让我们今天学习,让我们走吧!!1、先来分析一下demo。下面是一个典型的图表。如果我们要画这样一个图,我们应该怎么做,要准备什么数据,这样的图要注意哪些属性呢?1.如何制作图片?如何创建画板?2.如何设置数据?x,y的数据怎么放上去3.左上角各种线条颜色一样的小窗口怎么画出来?4.外观,不同线条的不同颜色如何处理?5.如何展示?6、如何保存?这么多问题,怎么办?循序渐进,我先给你看代码,看看你能理解多少x=np.linspace(0,2,100)plt.plot(x,x,label='linear')#绘制一些数据(隐式)axes.plt.plot(x,x**2,label='quadratic')#etc.plt.plot(x,x**3,label='cubic')plt.xlabel('xlabel')plt.ylabel('ylabel')plt.title("SimplePlot")plt.legend()二、matplotlib中的概念下图是官网上的一张图,说明了很多概念。基本都是我们常用的,大家可以看到,好像大部分都能看懂Figure(容器)。整张图片称为Figure,Figure用于保存返回的Axes(坐标域)。一个Figure可以包含任意数量的Axes,可以理解为一个容器。Axes(坐标域)可以理解为一个单独的画板,一个Axes包含两个Axis(坐标轴)(3D图中的三个Axis),每个Axes有一个title(方法:set_title()),一个x-label(method:set_xlabel()),一个y标签(方法:set_ylabel())。注意:给定的Axes对象只能包含在图中。Axis(坐标轴)这是一个类似于数轴的对象。坐标轴上刻度的样式和坐标轴上的值可以通过Axis和Axis的方法来设置。刻度的位置由Locater对象决定,刻度对应的值由Formatter对象决定。总结:坐标轴几乎就是我们头脑中的“情节”。可以说是一纸空文。一个图中可以有很多个Axes,但是某个Axes只能在一个图中。2维空间的Axes包含2个Axis(即x轴和y轴),3维空间的Axes包含3个Axis(即x轴、y轴)轴和z轴)。这里要注意区分Axes和Axis的概念。Axis是一个数值轴对象,主要用来设置一个Axes中的数据约束(即两个端点的值),轴上的刻度(即轴上的标记刻度)和刻度标签刻度的标签。Subplot:Subplot,在图形对象下创建一个或多个subplot对象(即坐标轴)来绘制图像。axes:设置坐标轴边界和曲面的颜色、坐标刻度值的大小和网格的显示figure:控制dpi、边界颜色、图形大小、subplot设置font:字体系列、字体大小和样式设置grid:设置网格颜色和linearlegend:设置图例及其中文字的显示line:设置线条(颜色、线型、宽度等)和markerspatch:是填充二维空间的图形对象,比如作为多边形和圆形。控制线宽、颜色、抗锯齿设置等。savefig:可以对保存的图形进行单独设置。例如,将渲染文档的背景设置为白色。verbose:设置matplotlib在执行过程中输出信息,例如silent、helped、debug和debug-annoying。xticks和yticks:设置x和y轴的主要和次要刻度的颜色、大小、方向和标签大小。3、matplotlib支持的图形3.1线图lineimportmatplotlib.pyplotaspltimportnumpyasnp#绘图数据t=np.arange(0.0,2.0,0.01)s=1+np.sin(2*np.pi*t)fig,ax=plt.subplots()ax.plot(t,s)ax.set(xlabel='time(s)',ylabel='voltage(mV)',title='就这么简单,伙计们')ax.grid()fig.savefig("test.png")plt.show()3.2直接图histimportnumpyasnpimportmatplotlib.pyplotaspltnp.random.seed(19680801)#exampledatamu=100#meanofdistributionsigma=15#分布的标准偏差x=mu+sigma*np.random.randn(437)num_bins=50fig,ax=plt.subplots()#数据直方图,bins,patches=ax.hist(x,num_bins,density=True)#添加“最佳拟合”liney=((1/(np.sqrt(2*np.pi)*sigma))*np.exp(-0.5*(1/sigma*(bins-mu))**2))ax.plot(bins,y,'--')ax.set_xlabel('Smarts')ax.set_ylabel('概率密度')ax.set_title(r'智商直方图:$\mu=100$,$\sigma=15$')#调整间距以防止ylabelfig被剪裁.tight_layout()plt.show()3.3路线importmatplotlib.pathasmpathimportmatplotlib.patchesasmpatchesimportmatplotlib.pyplotaspltfig,ax=plt.subplots()Path=mpath.Pathpath_data=[(Path.MOVETO,(1.58,-2.57)),(路径.CURVE4,(0.35,-1.1)),(路径.CURVE4,(-1.75,2.0)),(路径.CURVE4,(0.375,2.0)),(路径.LINETO,(0.85,1.15)),(Path.CURVE4,(2.2,3.2)),(Path.CURVE4,(3,0.05)),(Path.CURVE4,(2.0,-0.5)),(Path.CLOSEPOLY,(1.58,-2.57)),]codes,verts=zip(*path_data)path=mpath.Path(verts,codes)patch=mpatches.PathPatch(path,facecolor='r',alpha=0.5)ax.add_patch(patch)#绘制控制点和连接线x,y=zip(*path.vertices)line,=ax.plot(x,y,'go-')ax.grid()ax.axis('equal')plt.show()3.4散点图Scatter3.5极坐标图Polarplotsimportnumpyasnpimportmatplotlib.pyplotaspltr=np.arange(0,2,0.01)theta=2*np.pi*rfig,ax=plt.subplots(subplot_kw={'投影':'极地'})ax.plot(theta,r)ax.set_rmax(2)ax.set_rticks([0.5,1,1.5,2])#Lessradialticksax.set_rlabel_position(-22.5)#将径向标签从绘制的lineax.grid(True)ax.set_title("Alineplotonapolaraxis",va='bottom')plt.show()3.6饼图pieimportmatplotlib.pyplotasplt#饼图,切片将按逆时针方向排列和绘制:labels='Frogs','Hogs','Dogs','Logs'sizes=[15,30,45,10]explode=(0,0.1,0,0)#只“分解”第二个切片(即'Hogs')fig1,ax1=plt.subplots()ax1.pie(sizes,explode=explode,labels=labels,autopct='%1.1f%%',shadow=True,startangle=90)ax1.axis('equal')#等长宽比确保绘制饼图asacircle.plt.show()3.73d图形importmatplotlib.pyplotaspltfrommatplotlibimportcmfrommatplotlib.tickerimportLinearLocatorimportnumpyasnpfig,ax=plt.subplots(subplot_kw={"projection":"3d"})#Makedata.X=np.arange(-5,5,0.25)Y=np.arange(-5,5,0.25)X,Y=np.meshgrid(X,Y)R=np.sqrt(X**2+Y**2)Z=np.sin(R)#Plotthesurface.surf=ax.plot_surface(X,Y,Z,cmap=cm.coolwarm,linewidth=0,antialiased=False)#自定义z轴.ax.set_zlim(-1.01,1.01)ax.zaxis.set_major_locator(LinearLocator(10))#自动使用一个StrMethodFormatterax.zaxis.set_major_formatter('{x:.02f}')#添加一个映射值的颜色条到颜色。fig.colorbar(surf,shrink=0.5,aspect=5)plt.show()#使用numpy生成数据x=np.arange(-5,5,0.1)y=x*3#创建窗口,子图#方法1:先创建窗口,再创建子图(一定要画)fig=plt.figure(num=1,figsize=(15,8),dpi=80)#打开一个窗口,设置大小为同时,resolutionax1=fig.add_subplot(2,1,1)#通过fig添加一个subplot,参数:行数,列数,number。ax2=fig.add_subplot(2,1,2)#通过fig添加一个subplot,参数:行数,列数,number。print(fig,ax1,ax2)#方法二:一次创建窗口和多个子图。(空白不画)fig,axarr=plt.subplots(4,1)#新开一个窗口,添加4个subplots,返回subplot数组ax1=axarr[0]#通过subplot数组得到一个subplotprint(fig,ax1)#方法三:一次创建一个窗口和一个子图。(空白不画)ax1=plt.subplot(1,1,1,facecolor='white')#打开一个新窗口,创建一个子图。facecolorsetthebackgroundcolorprint(ax1)#获取窗口的引用,适用于以上三种方法#fig=plt.gcf()#获取当前图形#fig=ax1.figure#获取指定到的窗口subplotbelongs#fig.subplots_adjust(left=0)#设置窗口左内边距为0,即左边距为0。#设置子图的基本元素ax1.set_title('python-drawing')#设置图体,plt.titleax1.set_xlabel('x-name')#设置x轴名称,plt.xlabelax1.set_ylabel('y-name')#设置y轴名称,plt.ylabelplt。axis([-6,6,-10,10])#设置横纵轴范围,分解为下面两个函数ax1.set_xlim(-5,5)#设置横轴范围,将覆盖上水平坐标,plt.xlimax1.set_ylim(-10,10)#设置垂直轴范围,将覆盖上垂直坐标,plt.ylimxmajorLocator=MultipleLocator(2)#定义水平主刻度标签的刻度差作为亩ltipleof2就是每隔几个尺度显示一个标签文字ymajorLocator=MultipleLocator(3)#定义垂直主尺度标签的尺度差为3的倍数就是每隔几个尺度显示一个标签文字ax1.xaxis.set_major_locator(xmajorLocator)#x轴应用程序定义的水平主刻度格式。如果不应用,将使用默认比例尺格式ax1.yaxis.set_major_locator(ymajorLocator)#y轴应用定义的垂直主要比例尺格式。如果不应用,将使用默认的比例尺格式ax1.xaxis.grid(True,which='major')#x坐标轴的网格使用定义的主比例尺格式ax1.yaxis.grid(True,which='major')#x坐标轴的网格使用定义的主刻度格式ax1.set_xticks([])#去掉轴刻度ax1.set_xticks((-5,-3,-1,1,3,5))#设置坐标轴刻度ax1.set_xticklabels(labels=['x1','x2','x3','x4','x5'],rotation=-30,fontsize='small')#设置显示scale的文字,rotation旋转角度,fontsize字体大小plot1=ax1.plot(x,y,marker='o',color='g',label='legend1')#pointmap:markericonplot2=ax1.plot(x,y,linestyle='--',alpha=0.5,color='r',label='legend2')#折线图:linestylelinear,alphatransparency,colorcolor,labellegendtextax1.legend(loc='upperleft')#显示图例,plt.legend()ax1.text(2.8,7,r'y=3*x')#在指定位置显示文字plt.text()ax1.annotate('重要point',xy=(2,6),xytext=(3,1.5),#添加注释,参数:注释文本,pointingpoint,textposition,arrowpropertyarrowprops=dict(facecolor='black',shrink=0.05),)#显示网格。其中参数的取值为major(只画大比例尺),minor(只画小比例尺),两者都有,默认值为major。axisis'x','y','both'ax1.grid(b=True,which='major',axis='both',alpha=0.5,color='skyblue',linestyle='--',linewidth=2)axes1=plt.axes([.2,.3,.1,.1],facecolor='y')#在当前窗口添加一个子图,rect=[left,bottom,width,height],是使用的绝对布局,不占用现有窗口的空间axes1.plot(x,y)#在子图上绘制plt.savefig('aa.jpg',dpi=400,bbox_inches='tight')#savefig保存图片,dpi分辨率,bbox_inches子图周围空白大小plt.show()#打开窗口,对于方法1创建的窗口,必须绘制,对于方法二和方法三创建的窗口,如果坐标系全是空白,则不会绘图总结:以上数据大部分是从官网总结的:https://matplotlib.org/stable...如果以上不准确,可以参考官网。我不能完全理解它。我只能画一张能满足日常需要的简单图。点击关注,第一时间了解华为云的新鲜技术~