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()[0],linewidth=c.get_linewidth()[0])73绘图函数数简介三维绘图图mpl_toolkits.mplot3d模块块在matplotlib基基础上提提供了三三维绘图图的功能能。由于于它使用用matplotlib的二二维绘图图功能来

温馨提示

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

评论

0/150

提交评论