yhon科学计算与数据处理二_第1页
yhon科学计算与数据处理二_第2页
yhon科学计算与数据处理二_第3页
yhon科学计算与数据处理二_第4页
yhon科学计算与数据处理二_第5页
已阅读5页,还剩78页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Matplotlib—绘制精美的图表1目录快速绘图快速绘图绘制多轴图坐标轴设定绘图函数简介对数坐标图极坐标图柱状图散列图

2目录图像等值线图三维绘图34快速绘图快速绘图matplotlib的pyplot子库提供了和matlab类似的绘图API,方便用户快速绘制2D图表。(matplotlib_simple_plot.py)

pylab模块matplotlib还提供了名为pylab的模块,其中包括了许多numpy和pyplot中常用的函数,方便用户快速进行计算和绘图,可以用于IPython中的快速交互式使用。

5快速绘图matplotlib中的快速绘图的函数库可以通过如下语句载入:接下来调用figure创建一个绘图对象,并且使它成为当前的绘图对象。通过figsize参数可以指定绘图对象的宽度和高度,单位为英寸;dpi参数指定绘图对象的分辨率,即每英寸多少个像素,缺省值为80。因此本例中所创建的图表窗口的宽度为8*80=640像素。importmatplotlib.pyplotaspltplt.figure(figsize=(8,4))6快速绘图也可以不创建绘图对象直接调用接下来的plot函数直接绘图,matplotlib会自动创建一个绘图对象。

如果需要同时绘制多幅图表的话,可以是给figure传递一个整数参数指定图标的序号,如果所指定序号的绘图对象已经存在的话,将不创建新的对象,而只是让它成为当前绘图对象。下面的两行程序通过调用plot函数在当前的绘图对象中进行绘图:plt.plot(x,y,label="$sin(x)$",color="red",linewidth=2)plt.plot(x,z,"b--",label="$cos(x^2)$")7快速绘图plot函数的调用方式很灵活,第一句将x,y数组传递给plot之后,用关键字参数指定各种属性:•label:给所绘制的曲线一个名字,此名字在图示(legend)中显示。只要在字符串前后添加''$''符号,matplotlib就会使用其内嵌的latex引擎绘制的数学公式。•color:指定曲线的颜色•linewidth:指定曲线的宽度第三个参数‘’b--``指定曲线的颜色和线型plt.plot(x,y,label="$sin(x)$",color="red",linewidth=2)plt.plot(x,z,"b--",label="$cos(x^2)$“)8快速绘图接下来通过一系列函数设置绘图对象的各个属性:•xlabel/ylabel:设置X轴/Y轴的文字•title:设置图表的标题•ylim:设置Y轴的范围•legend:显示图示最后调用plt.show()显示出创建的所有绘图对象。plt.xlabel("Time(s)")plt.ylabel("Volt")plt.title("PyPlotFirstExample")plt.ylim(-1.2,1.2)plt.legend()9快速绘图

importnumpyasnpimportmatplotlib.pyplotasplt

x=np.linspace(0,10,1000)y=np.sin(x)z=np.cos(x**2)

plt.figure(figsize=(8,4))plt.plot(x,y,label="$sin(x)$",color="red",linewidth=2)plt.plot(x,z,"b--",label="$cos(x^2)$")plt.xlabel("Time(s)")plt.ylabel("Volt")plt.title("PyPlotFirstExample")plt.ylim(-1.2,1.2)plt.legend()plt.show()10快速绘图图11快速绘图图还可以调调用plt.savefig()将将当前的的Figure对象保保存成图图像文件件,图像格式式由图像像文件的的扩展名名决定。。下面的的程序将将当前的的图表保保存为“test.png”,,并且通通过dpi参数数指定图图像的分分辨率为为120,,因此输输出图像像的宽度度为“8X120=960”个个像素。。实际上不不需要调调用show()显示示图表,,可以直直接用savefig()将将图表保保存成图图像文件件.使用这这种方法法可以很很容易编编写出批批量输输出图表表的程序序.runmatplotlib_simple_plot.pyplt.savefig("test.png",dpi=120)12快速绘图图绘制多轴轴图一个绘图图对象(figure)可以包含含多个轴轴(axis),在Matplotlib中用轴表表示一个个绘图区区域,可可以将其其理解为为子图。。上面的的第一个个例子中中,绘图图对象只只包括一一个轴,,因此只只显示了了一个轴轴(子图(Axes))。可以使使用subplot函数快速速绘制有有多个轴轴的图表表。subplot函数的调调用形式式如下::subplot(numRows,numCols,plotNum)13快速绘图图subplot将整个绘绘图区域域等分为为numRows行和numCols列个子区区域,然然后按照照从左到到右,从从上到下下的顺序序对每个个子区域域进行编编号,左左上的子子区域的的编号为为1。如果numRows,numCols和plotNum这三个数数都小于于10的话,可可以把它它们缩写写为一个个整数,,例如subplot(323)和subplot(3,2,3)是相同的的。subplot在plotNum指定的区区域中创创建一个个轴对象象。如果果新创建建的轴和和之前创创建的轴轴重叠的的话,之之前的轴轴将被删删除。14快速绘图图下面的程程序创建建3行2列共6个轴,通通过axisbg参数给每每个轴设设置不同同的背景景颜色。。如果希望望某个轴轴占据整整个行或或者列的的话,可可以如下下调用subplot:foridx,colorinenumerate("rgbyck"):plt.subplot(320+idx+1,axisbg=color)plt.show()plt.subplot(221)#第一行的的左图plt.subplot(222)#第一行的的右图plt.subplot(212)#第二整行行plt.show()15快速绘图图当绘图对对象中有有多个轴轴的时候候,可以以通过工工具栏中中的ConfigureSubplots按钮,交交互式地地调节轴轴之间的的间距和和轴与边边框之间间的距离离。如果果希望在在程序中中调节的的话,可可以调用用subplots_adjust函数,它它有left,right,bottom,top,wspace,hspace等几个关关键字参参数,这这些参数数的值都都是0到1之间的小小数,它它们是以以绘图区区域的宽宽高为1进行正规规化之后后的坐标标或者长长度。16快速绘图图subplot()返返回它所所创建的的Axes对象象,可以以将它用用变量保保存起来来,然后后用sca()交替让让它们成成为当前前Axes对象象,并调调用plot()在其其中绘图图。如果果需要同同时绘制制多幅图图表,可可以给figure()传递递一个整整数参数数指定Figure对对象的序序号,如如果序号号所指定定的figure对象象已经存存在,将将不创建建新的对对象,而而只是让让它成为为当前的的Figure对象。。下面的的程序演演示了如如何依次次在不同同图表的的不同子子图中中绘制曲曲线。(matplotlib_multi_figure.py)17快速绘图首先通过figure()创创建了两个个图表,它它们的序号号分别为1和2。然后在在图表2中创建了了上下并并排的两个个子图,并并用变量ax1和ax2保存存。importnumpyasnpimportmatplotlib.pyplotaspltplt.figure(1)#创建图表1plt.figure(2)#创建图表2ax1=plt.subplot(211)#在图表2中创建子图图1ax2=plt.subplot(212)#在图表2中创建子图图2x=np.linspace(0,3,100)18快速绘图在循环中,先先调用figure(1)让图表1成为当前图图表,并在其其中绘图。然然后调用sca(ax1)和sca(ax2)分别让让子图ax1和ax2成成为当前子图图,并在其中中绘图。当它它们成为当前前子图时,包包含它们的图图表2也自动成为为当前图表,,因此不需要要调用figure(2)依次次在图表1和图表2的的两个子图图之间切换,,逐步在其中中添加新的曲曲线foriinxrange(5):plt.figure(1)#选择图表1plt.plot(x,np.exp(i*x/3))plt.sca(ax1)#选择图表2的子图1plt.plot(x,np.sin(i*x))plt.sca(ax2)#选择图表2的子图2plt.plot(x,np.cos(i*x))plt.show()19快速速绘绘图图20快速速绘绘图图坐标标轴轴设设定定Axis容容器器包包括括坐坐标标轴轴的的刻刻度度线线、、刻刻度度标标签签、、坐坐标标网网格格以以及及坐坐标标轴轴标标题题等等内内容容。。刻刻度度包包括括主主刻刻度度和和副副刻刻度度,,分分别别通通过过get_major_ticks()和和get_minor_ticks()方方法法获获得得。。每每个个刻刻度度线线都都是是一一个个XTick或或YTick对对象象,,它它包包括括实实际际的的刻刻度度线线和和刻刻度度标标签签。。为为了了方方便便访访问问刻刻度度线线和和文文本本,,Axis对对象象提提供供了了get_ticklabels()和和get_ticklines()方方法法,可以直接获获得刻度标签签和刻度线。。下面例子进进行绘图并得得到当前子图图的X轴对象象axis:>>>plt.plot([1,2,3],[4,5,6])>>>plt.show()>>>axis=plt.gca().xaxis21快速绘图获得axis对象的刻度位置列列表:下面获得axis对象的的刻度标签以以及标签中的的文字:>>>axis.get_ticklocs()array([1.,1.5,2.,2.5,3.])>>>axis.get_ticklabels()#获得刻度标签签列表<alistof5Textmajorticklabelobjects>>>>[x.get_text()forxinaxis.get_ticklabels()]#获得刻度的文文本字符串[u'1.0',u'1.5',u'2.0',u'2.5',u'3.0‘]22快速绘图23快速绘绘图下面获获得X轴上表示示主刻刻度线线的列列表,,可看看到X轴上上共有有10条刻刻度线线由于没没有副副刻度度线,,因此此副刻刻度线线列表表的长长度为为0:使用pyplot模模块中的xticks()能能够完成X轴上刻度度标签的配配置:>>>axis.get_ticklines()<alistof10Line2Dticklinesobjects>>>>axis.get_ticklines(minor=True)#获得副刻度度线列表<alistof0Line2Dticklinesobjects>>>>plt.xticks(fontsize=16,color="red",rotation=45)24快速绘图图上面的例例子中副副刻度线线列表为为空,这这是因为为用于计计算副刻刻度位置置的对象象默认为为NullLocator,它不不产生任任何刻度度线。而而计算主主刻度位位置的对对象为AutoLocator,它它会根据据当前的的缩放等等配置自自动计算算刻度的的位置.matplotlib提供了了多种配配置刻度度线位置置的Locator类类,以及及控制刻刻度标签签显示的的Formatter类。。下面的的程序设设置X轴的主主刻度为为π/4,副副刻度为为π/20,并且主主刻度上上的标签签用数学学符号显显示π。(matplotlib_axis_text.py自定义义坐标轴轴的刻度度和文字字)25快速绘图图与刻度定定位和文文本格式式化相关关的类都都在matplotlib.ticker模块中中定义,,程序从从中载入入了两个个类:MultipleLocaton,FuncFormatter.frommatplotlib.tickerimportMultipleLocator,FuncFormatterimportmatplotlib.pyplotasplfrommatplotlib.tickerimportMultipleLocator,FuncFormatterimportnumpyasnpx=np.arange(0,4*np.pi,0.01)y=np.sin(x)pl.figure(figsize=(8,4))pl.plot(x,y)ax=pl.gca()26快速绘图图程序中通通过pi_formatter()计算出刻刻度值对对应的刻刻度文本本.(很繁琐琐)defpi_formatter(x,pos):m=np.round(x/(np.pi/4))n=4whilem!=0andm%2==0:m,n=m//2,n//2ifm==0:return"0"ifm==1andn==1:return"$\pi$"ifn==1:returnr"$%d\pi$"%mifm==1:returnr"$\frac{\pi}{%d}$"%nreturnr"$\frac{%d\pi}{%d}$"%(m,n)27快速绘图图>>>X=np.linspace(0,4*np.pi,17,endpoint=True)>>>Xarray([0.,0.78539816,1.57079633,2.35619449,3.14159265,3.92699082,4.71238898,5.49778714,6.28318531,7.06858347,7.85398163,8.6393798,9.42477796,10.21017612,10.99557429,11.78097245,12.56637061])>>>plt.xticks([0.,0.78539816,1.57079633,2.35619449,3.14159265,3.92699082,4.71238898,5.49778714,6.28318531,7.06858347,7.85398163,8.6393798,9.42477796,10.21017612,10.99557429,11.78097245,12.56637061],[r'$0$',r'$\pi/4$',r'$\pi/2$',r'$3\pi/4$',r'$\pi$',r'$5\pi/4$',r'$3\pi/2$',r'$7\pi/4$',r'$2\pi$',r'$9\pi/4$',r'$5\pi/2$',r'$11\pi/4$',r'$3\pi$',r'$13\pi/4$',r'$7\pi/2$',r'$15\pi/4$',r'$4\pi$'])#r'$\frac{2\pi}{3}$',28快速绘图图以指定值值的整数数倍为刻刻度放置置主、副副刻度线线。使用指定定的函数数计算刻刻度文本本,它会会将刻度度值和刻刻度的序序号作为为参数传传递给计计算刻度度文本的的函数.ax.xaxis.set_major_locator(MultipleLocator(np.pi/4))ax.xaxis.set_minor_locator(MultipleLocator(np.pi/20))ax.xaxis.set_major_formatter(FuncFormatter(pi_formatter))#设置两个坐标标轴的范围pl.ylim(-1.5,1.5)pl.xlim(0,np.max(x))29快速绘图pl.subplots_adjust(bottom=0.15)#设置图的底边边距pl.grid()#开启网格#主刻度为pi/4ax.xaxis.set_major_locator(MultipleLocator(np.pi/4))#主刻度文本用用pi_formatter函数计算ax.xaxis.set_major_formatter(FuncFormatter(pi_formatter))#副刻度为pi/20ax.xaxis.set_minor_locator(MultipleLocator(np.pi/20))#设置刻度文本本的大小fortickinax.xaxis.get_major_ticks():tick.label1.set_fontsize(16)pl.show()30快速绘图31绘图函数简介介对数坐标图前面介绍过如如何使用plot()绘绘制曲线图,,所绘制图表表的X-Y轴轴坐标都是算算术坐标。下下面看看如何何在对数坐标标系中绘图。。绘制对数坐标标图的函数有有三个:semilogx()、semilogy()和和loglog(),它它们分别绘制制X轴为对数坐坐标、Y轴为对数坐坐标以及两个个轴都为对数数坐标时的图图表。32绘图函数简介介下面的程序使使用4种不同的坐坐标系绘制低低通滤波器的的频率响应曲曲线。其中中,左上图为为plot()绘制的算术术坐标系,右右上图为semilogx()绘制制的X轴对数坐标标系,左下图图为semilogy()绘绘制的Y轴对对数坐标系,,右下图为loglog()绘制的的双对数坐标标系。使用双双对数坐标系系表示的频率率响应曲线通通常被称为波波特图。(matplotlib_log.py)importnumpyasnpimportmatplotlib.pyplotaspltw=np.linspace(0.1,1000,1000)p=np.abs(1/(1+0.1j*w))#计算算低低通通滤滤波波器器的的频频率率响响应应33绘图图函函数数简简介介plt.subplot(221)plt.plot(w,p,linewidth=2)plt.ylim(0,1.5)plt.subplot(222)plt.semilogx(w,p,linewidth=2)plt.ylim(0,1.5)plt.subplot(223)plt.semilogy(w,p,linewidth=2)plt.ylim(0,1.5)plt.subplot(224)plt.loglog(w,p,linewidth=2)plt.ylim(0,1.5)plt.show()34绘图图函函数数简简介介35绘图图函函数数简简介介极坐坐标标图图极坐坐标标系系是是和和笛笛卡卡尔尔(X-Y)坐坐标标系系完完全全不不同同的的坐坐标标系系,,极极坐坐标标系系中中的的点点由由一一个个夹夹角角和和一一段段相相对对中中心心点点的的距距离离来来表表示示。。下下面面的的程程序序绘绘制制极极坐坐标标图图,,(matplotlib_polar.py)。。importnumpyasnpimportmatplotlib.pyplotasplttheta=np.arange(0,2*np.pi,0.02)36绘图图函函数数简简介介程序序中中调调用用subplot()创创建建子子图图时时通通过过设设polar参参数数为为True,创创建建一一个个极极坐坐标标子子图图。。然然后后调调用用plot()在在极极坐坐标标子图中中绘图图。也也可以以使用用polar()直接创创建极极坐标标子图图并在在其中中绘制制曲线线。plt.subplot(121,polar=True)plt.plot(theta,1.6*np.ones_like(theta),linewidth=2)plt.plot(3*theta,theta/3,"--",linewidth=2)37绘图函函数简简介rgrids()设置同同心圆圆栅格格的半半径大大小和和文字字标注注的角角度。。因此此右图图中的的虚线线圆圈圈有三三个,,半半径分分别为为0.5、1.0和和1.5,这这些文文字沿沿着45°°线排排列。。Thetagrids()设置放射射线栅格格的角度度,因因此右图图中只有有两条放放射线,,角度分分别为0°和45°。。plt.subplot(122,polar=True)plt.plot(theta,1.4*np.cos(5*theta),"--",linewidth=2)plt.plot(theta,1.8*np.cos(4*theta),linewidth=2)plt.rgrids(np.arange(0.5,2,0.5),angle=45)plt.thetagrids([0,45])plt.show()38绘图函数数简介39绘图函数数简介柱状图柱状图用用其每根根柱子的的长度表表示值的的大小,它它们通常常用来比比较两组组或多组组值。下下面的程程序从文文件中读读入中国国人口的的年龄分分布数据据,并使用用柱状图图比较男男性和女女性的年年龄分布布。(matplotlib_bar.py绘制比较男男女人口的的年龄分布布图)importnumpyasnpimportmatplotlib.pyplotasplt40绘图函数简简介读入的数据据中,第0列为年龄龄,它将作作为柱状图图的横坐标标。首先计计算柱状图图中每根柱柱子的宽宽度,因为为要在每个个年龄段上上绘制两根根柱子,因因此柱子的的宽度应该该小于年龄龄段的二分分之一。。这里以年年龄段的0.4倍作作为柱子的的宽度。data=np.loadtxt("china_population.txt")width=(data[1,0]-data[0,0])*0.441绘图函数简简介调用bar()绘制制男性人口口分布的柱柱状图。它它的第一个个参数为每每根柱子左左边缘的横横坐标,为为了让男男性和女性性的柱子以以年龄刻度度为中心,,这里让每每根柱子左左侧的横坐坐标为“年年龄减去柱柱子的宽度度”。Bar()的的第二个参参数为每根根柱子的高高度,第三三个参数指指定所有柱柱子的宽度度。当第三三个参数为为序列时,,可以为每每根柱子指指定宽度。。plt.figure(figsize=(8,5))plt.bar(data[:,0]-width,data[:,1]/1e7,width,color="b",label=u"男")42绘图函数简简介绘制女性人人口分布的的柱状图,,这里以年年龄为柱子子的左边缘缘横坐标,,因此女性性和男性的的人口分分布图以年年龄刻度为为中心。由由于bar()不自自动修改颜颜色,因此此程序中通通过color参数数设置两个个柱状图图的颜色。。plt.bar(data[:,0],data[:,2]/1e7,width,color="r",label=u"女")plt.xlim(-width,100)plt.xlabel(u"年龄")plt.ylabel(u"人口(千万万)")plt.legend()plt.show()43绘图函数简简介44绘图函数简简介散列图使用plot()绘绘图时,如如果指定样样式参数为为仅绘制数数据点,那那么所绘制制的就是一一幅散列图图。例如如:但是这种方方法所绘制制的点无法法单独指定定颜色和大大小。而scatter()所绘制的的散列图却却可以指定定每个点的的颜色和大大小。下面面的程序演演示scatter()的用用法(matplotlib_scatter.py).>>>plt.plot(np.random.random(100),np.random.random(100),"o")45绘图函数简简介scatter()的前两个个参数是数数组,分别别指定每个个点的X轴和Y轴的坐标标。s参数数指定点的的大小,,值和点的的面积成正正比。它可可以是一个个数,importnumpyasnpimportmatplotlib.pyplotaspltplt.figure(figsize=(8,4))x=np.random.random(100)y=np.random.random(100)plt.scatter(x,y,s=x*1000,c=y,marker=(5,1),alpha=0.8,lw=2,facecolors="none")plt.xlim(0,1)plt.ylim(0,1)plt.show()46绘图函数简简介指定所有点点的大小;;也可以是是数组,分分别对每个个点指定大大小。c参数指定定每个点的的颜色,可可以是数值值或数组。。这里使用用一维数组组为每个点点指定了一一个数值。。通过颜色色映射表,,每个数值值都会与一一个颜色相相对应。默默认的颜色色映射表中中蓝色与最最小值对应应,红色与与最大值对应。。当c参数是形形状为(N,3)或或(N,4)的二维维数组时,,则直接表表示每个点点的RGB颜色。marker参数设置点的形形状,可以以是个表示示形状的字字符串,也也可以是表表示多边形形的两个元元素的元组组,第一个个元素表示示多边形的的边数,47绘图函数简简介第二个元素素表示多边边形的样式式,取值范范围为0、1、2、3。0表示多边边形,1表表示星形,,2表示放放射形,3表示忽略略边数而显显示为圆形形。最后,通过过alpha参数设设置点的透透明度,通通过lw参参数设置线线宽,lw是linewidth的的缩写。facecolors参数数为“none””时,表示示散列点没没有填充色色。48绘图函数简简介49绘图函数简简介图像imread()和和imshow()提供了简简单的图像像载入和显显示功能.imread()可以从图像像文件读入入数据,得得到一个表表示图像的的NumPy数组组。它的的第一个个参数是是文件名名或文件件对象,,format参数指指定图像像类型,,如果省省略,就就由文件件的扩展展名决定定图像类类型。对对于灰灰度图像像,它返返回一个个形状为为(M,,N)的的数组;;对于彩彩色图像像,返冋冋形状为为(M,N,C)的数组组。其其中,M为图像像的高度,N为图图像的宽宽度,C为3或4,表示图图像的通通道数。。>>>img=plt.imread(“lena.jpg“)50绘图函数数简介下面的程程序从““lena.jpg”中读读入图像像数据,,得到的的数组img是是一个形形状为(393,512,3)的单单字节无无符号整整数数组组。这是是因为通通常使用用的图像像都是采采用单字字节分别别保存每每个像素素的红、、绿、蓝蓝三个通通道的分分量:>>>img=plt.imread("lena.jpg")>>>img.shape(393L,512L,3L)>>>img.dtypedtype('uint8')51绘图函数数简介imshow()可以以用来显显示imread()返回的数组组。如果果数组是是表示多多通道图图像的三三维数组组,那么么每个像像素的颜颜色由各各个通道道的值决决定:请注意,,从JPG图图像中读读入的数数据是上上下颠倒倒的,为了正常常显示图图像,可可以将数数组的第第0轴反转转,或者者设置imshow()的origin参参数为“lower”,从而让让所显示示图表的的原点在在左下角角:>>>plt.imshow(img)#注意图像像是上下下颠倒的的>>>plt.imshow(img[::-1])#反转图像像数组的的第0轴#or>>>plt.imshow(img,origin="lower")#让图表的的原点在在左下角角52绘图函数数简介如果三维维数组的的元素类类型为浮浮点数,,那么元元素的取取值范围围为0.0到1.0,与颜色色值0到255对对应。超超出这个个范围可可能会出出现颜色色异常的的像素。。下面的的例子将将数组img转转换为浮浮点数组组并用imshow()进进行显示示:>>>img=img[::-1]>>>plt.imshow(img*1.0)#取值值范范围围为为0.0到255.0的浮点数数组,不不能正确确显示颜颜色>>>plt.imshow(img/255.0)#取值范围围为0.0到1.0的浮点数数组,能能正确显显示颜色色>>>plt.imshow(np.clip(img/200.0,0,1))#使用clip()限制取值值范围,,整个图图像变亮亮53绘图函数数简介如果imshow()的参数数是二维维数组,,就使用用颜色映映射表决决定每个个像素的的颜色。。下面显显示图像像中的红红色通道道:显示效果果比较吓吓人,因因为默认认的图像像映射将将最小值值映射为为蓝色、、将最大大值映射射为红色色.可以使用用colorbar()将颜色色映射表表在图表表中显示示出来::>>>plt.imshow(img[:,:,0])>>>plt.colorbar()54绘图函数数简介通过imshow()的cmap参参数可以以修改显显示图像像时所采采用的颜颜色映射射表。颜颜色映射射表是一一个ColorMap对象象,matplotlib中中已经预预先定义义好了很很多颜色色映射表表,可通通过下面面的语句句找到这这些颜颜色映射射表的名名字:(matplotlib_imshow.py)下面使用用名为copper的的颜色映映射表显显示图像像的红色色通道,,很有老老照片的的味道:>>>importmatplotlib.cmascm>>>cm._cmapnames[‘Spectral’,’’copper’,‘‘RdYlGn',‘Set2’,’’sumner’’,’’spring’,’gist_ncar’’,…]>>>plt.imshow(img[:,:,0],cmap=cm.copper)55绘图函数简简介importnumpyasnpimportmatplotlib.pyplotaspltimportmatplotlib.cmascmplt.subplots_adjust(0,0,1,1,0.05,0.05)plt.subplot(331)img=plt.imread("lena.jpg")plt.imshow(img)plt.subplot(332)plt.imshow(img[::-1])plt.subplot(333)plt.imshow(img,origin="lower")img=img[::-1]plt.subplot(334)plt.imshow(img*1.0)56绘图函数简简介plt.subplot(335)plt.imshow(img/255.0)plt.subplot(336)plt.imshow(np.clip(img/200.0,0,1))plt.subplot(325)plt.imshow(img[:,:,0])plt.colorbar()plt.subplot(326)plt.imshow(img[:,:,0],cmap=cm.copper)plt.colorbar()foraxinplt.gcf().axes:ax.set_axis_off()ax.set_axis_off()plt.show()57绘图函数简简介58绘图函数简简介还可以使用用imshow()显示任意意的二维数数据,例如如下面的程程序使用图图像直观地地显示了二二元函数.(matplotlib_2dfunc.py使使用imshow()可视化化二元函数数)importnumpyasnpimportmatplotlib.pyplotaspltimportmatplotlib.cmascmy,x=np.ogrid[-2:2:200j,-2:2:200j]z=x*np.exp(-x**2-y**2)extent=[np.min(x),np.max(x),np.min(y),np.max(y)]59绘图函数简介介首先通过数组组的广播功能能计算出表示示函数值的二二维数组Z,注意它的第第0轴表示Y轴、第1轴表示X轴轴。然后将X、Y轴的取值范范围保存到extent列表中。plt.figure(figsize=(10,3))plt.subplot(121)plt.imshow(z,extent=extent,origin="lower")plt.colorbar()plt.subplot(122)plt.imshow(z,extent=extent,cmap=cm.gray,origin="lower")plt.colorbar()plt.show()60绘图函数简介介将extent列表传递递给imshow()的extent参数,,这样一来,,图表的X、Y轴的刻度标标签将使用extent列表所指定定的范围.61绘图函数简介介等值线图还可以使用等等值线图表示示二元函数。。所谓等值线线,是指由函函数值相等的的各点连成的的平滑曲线。。等值线可以以直观地表示示二元函数值值的变化趋势势,例如等值值线密集的地地方表示函数数值在此处的的变化较大。。matplotlib中可以使用用contour()和和contourf()描绘等值线线,它们的区区别是:contourf()所得得到的是带填填充效果的等等值线。(matplotlib_contour.py用contour和contourf描绘等等值线图)62绘图函数简介介importnumpyasnpimportmatplotlib.pyplotasplty,x=np.ogrid[-2:2:200j,-3:3:300j]z=x*np.exp(-x**2-y**2)extent=[np.min(x),np.max(x),np.min(y),np.max(y)]plt.figure(figsize=(10,4))plt.subplot(121)cs=plt.contour(z,10,extent=extent)plt.clabel(cs)plt.subplot(122)plt.contourf(x.reshape(-1),y.reshape(-1),z,20)plt.show()63绘图函数简介介为了更淸楚地地区分X轴和Y轴,这里让让它们的取值值范围和等分分次数均不相相同.这样得得到的数组组z的形状为为(200,300),它的第0轴对应Y轴、第1轴对应X轴轴。调用contour()绘制数组z的等值线图图,第二个参参数为10,表示将将整个函数的的取值范围等等分为10个区间,即显示的等等值线图中将将有9条等值线。。和imshow()一样,可以使使用extent参数指定定等值线图的的X轴和Y轴的数据范范围。contour()所返回的的是一个QuadContourSet对象,,将它传递递给clabel(),为其中的等等值线标上对对应的值。64绘图函数简介介调用contourf(),绘制将将取值范围等等分为20份、带填填充效果的等等值线图。这这里演示了了另外一种设设置X、Y轴取值范围围的方法。它它的前两个参参数分别是计计算数组z时时所使用的X轴和Y轴上的取样样点,这两个个数组必须是是一维的。65绘图函数简介介还可以使用等等值线绘制隐隐函数曲线.显然,无无法像绘制一一般函数那样样,先创建一一个等差数组组表示变量的取值点,,然后计算出出数组中每个个x所对应的y值。可以使使用等值线解解决这个问题题,显然隐函函数的曲线就就是值等于0的那条等值值线。下面的的程序绘制函函数在f(x,y)=0和f(x,y)-0.1=0时的曲曲线.(matplotlib_implicit_func.py)importnumpyasnpimportmatplotlib.pyplotasplty,x=np.ogrid[-1.5:1.5:200j,-1.5:1.5:200j]f=(x**2+y**2)**4-(x**2-y**2)**266绘图图函函数数简简介介plt.figure(figsize=(9,4))plt.subplot(121)extent=[np.min(x),np.max(x),np.min(y),np.max(y)]cs=plt.contour(f,extent=extent,levels=[0,0.1],colors=["b","r"],linestyles=["solid","dashed"],linewidths=[2,2])plt.subplot(122)forcincs.collections:data=c.get_paths()[0].verticesplt.plot(data[:,0],data[:,1],color=c.get_color()[0],linewidth=c.get_linewidth()[0])plt.show()67绘图图函函数数简简介介68绘图函数数简介在调用contour()绘绘制等值值线时,,可以通通过levels参数数指定所所绘制等等值线对对应的函函数值,,这里里设置levels参参数为[0,0.1],因此此最终将将绘制两两条等值值线。观察图会发现,,表示隐隐函数f(x)=0蓝蓝色实线线并不是是完全连连续的,,在图的的中间部部分它由由许多孤孤立的小小段构成成。因为为等值线线在原点点附近无无限靠近近,因此此无论对对函数f的取值值空间如如何进行行细分,,总是会会有无法法分开的的地方,,最终造成成了图中中的那些些孤立的的细小区区域。而而表示隐隐函数f(x,y)-0.1=0的的红色虚虚线则是是闭合且且连续的的。69绘图函数数简介可以通过过contour()返回的的对象获获得等值值线上每每点的数数据,下下面在IPython中观察察变量cs,它它是一个个QuadContourSet对象象:cs对象象的collections属性是是一个等等值线列列表,每每条等值值线用一一个LineCollection对象表表示:>>>cs.collections<alistof2mcoll.LineCollectionobjects>>>>runmatplotlib_implicit_func.py>>>cs<matplotllb.contour.QuadContourSetinstanceat0x0A348E90>70绘图函函数简简介每个LineCollection对对象都都有它它自己己的颜颜色、、线型型、线线宽等等属性性,注注意这这些属属性所所获得得的结结果外外面还还有一一层封封装,,要获获得其其第0个元元素才才是真真正的的配置置:由类名名可知知,LineCollection对对象是是一组组曲线线的集集合,,因此此它可可以表表示像像蓝色色实线线那样样由多多条线线构成成的等等值线线。它它的get_paths()方法法获得得构成成等值值线的的所有有路径径,本本例中中蓝色色实线线>>>c.get_color()[0]array([1.,0.,0.,1.])>>>c.get_linewidth()[0]271绘图函函数简简介所表示示的等等值线线由42条条路径径构成成:路径是是一个个Path对象象,通通过它它的vertices属属性可可以获获得路路径上上所有有点的的坐标标:>>>len(cs.collections[0].get_paths())42>>>path=cs.collections[0].get_paths()[0]>>>type(path)<class'matplotlib.path.Path>>>>path.verticesarray([[-0.08291457,-0.98938936],[-0.09039269,-0.98743719],…,[-0.08291457,-0.98938936]])72绘图函函数简简介下面的的程序序从等等值线线集合合cs中找找到表表示等等值线线的路路径,,并使使用plot()将将其绘绘制出出来.plt.subplot(122)forcincs.collections:data=c.get_paths()[0].verticesplt.plot(data[:,0],data[:,1],color=c.get_color

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论