1、单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,Python,的绘图库,matplotlib,快速入门,1,2,Matplotlib,绘制精美的图表,matplotlib,是,python,最著名的绘图库,它提供了一整套和,matlab,相似的命令,API,,十分适合交互式地进行制图。而且也可以方便地将它作为绘图控件,嵌入,GUI,应用程序中。,它的文档相当完备,并且,Gallery,页面中有上百幅缩略图,打开之后都有源程序。因此如果你需要绘制某种类型的图,只需要在这个页面中浏览,/,复制,/,粘贴一下,基本上都能搞定。,展示页面的地址:,=640,像
2、素。,5,import matplotlib.pyplot as plt,plt.figure(figsize=(8,4),快速绘图,也可以不创建绘图对象直接调用接下来的,plot,函数直接绘图,,matplotlib,会自动创建一个绘图对象。,如果需要同时绘制多幅图表的话,可以是给,figure,传递一个整数参数指定图标的序号,如果所指定序号的绘图对象已经存在的话,将不创建新的对象,而只是让它成为当前绘图对象。,下面的两行程序通过调用,plot,函数在当前的绘图对象中进行绘图:,6,plt.plot(x,y,label=$sin(x)$,color=red,linewidth=2),plt.
3、plot(x,z,b-,label=$cos(x2)$),快速绘图,plot,函数的调用方式很灵活,第一句将,x,y,数组传递给,plot,之后,用关键字参数指定各种属性:,label:,给所绘制的曲线一个名字,此名字在图示,(legend),中显示。只要在字符串前后添加,$,符,号,,matplotlib,就会使用其内嵌的,latex,引擎绘制的数学公式。,color:,指定曲线的颜色,linewidth:,指定曲线的宽度,第三个参数,b-,指定曲线的颜色和线型,7,plt.plot(x,y,label=$sin(x)$,color=red,linewidth=2),plt.plot(x,z
4、b-,label=$cos(x2)$“),快速绘图,接下来通过一系列函数设置绘图对象的各个属性:,xlabel/ylabel:,设置,X,轴,/Y,轴的文字,title:,设置图表的标题,ylim:,设置,Y,轴的范围,legend:,显示图示,最后调用,plt.show(),显示出创建的所有绘图对象。,8,plt.xlabel(Time(s),plt.ylabel(Volt),plt.title(PyPlot First Example),plt.ylim(-1.2,1.2),plt.legend(),快速绘图,9,import numpy as np,import matplotlib.
5、pyplot as plt,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(x2)$),plt.xlabel(Time(s),plt.ylabel(Volt),plt.title(PyPlot First Example),plt.ylim(-1.2,1.2),plt.legend(),plt.show(),快速绘图,10,快速绘图,还可
6、以调用,plt.savefig(),将当前的,Figure,对象保存成图像文件,,图,像格式由图像文件的扩展名决定。下面的程序将当前的图表保存为,“,test.png”,,并且通过,dpi,参数指定图像的分辨率为,120,,因此输出图像的宽度为,“,8X120=960”,个像素。,实际上不需要调用,show(),显示图表,可以直接用,savefig(),将图表保存成图像文件,.,使用这种方法可以很容易编写出 批量输出图表的程序,.,11,run matplotlib_simple_plot.py,plt.savefig(test.png,dpi=120),快速绘图,绘制多轴图,一个绘图对象,(
7、figure),可以包含多个轴,(axis),,在,Matplotlib,中用轴表示一个绘图区域,可以将其理解为子图。上面的第一个例子中,绘图对象只包括一个轴,因此只显示了一个轴,(,子图,(Axes),。可以使用,subplot,函数快速绘制有多个轴的图表。,subplot,函数的调用形式如下:,12,subplot(numRows,numCols,plotNum),快速绘图,subplot,将整个绘图区域等分为,numRows,行和,numCols,列个子区域,然后按照从左到右,从上到下的顺序对每个子区域进行编号,左上的子区域的编号为,1,。如果,numRows,,,numCols,和,p
8、lotNum,这三个数都小于,10,的话,可以把它们缩写为一个整数,例如,subplot(323),和,subplot(3,2,3),是相同的。,subplot,在,plotNum,指定的区域中创建一个轴对象。如果新创建的轴和之前创建的轴重叠的话,之前的轴将被删除。,13,快速绘图,下面的程序创建,3,行,2,列共,6,个轴,通过,axisbg,参数给每个轴设置不同的背景颜色。,如果希望某个轴占据整个行或者列的话,可以如下调用,subplot,:,14,for idx,color in enumerate(rgbyck):,plt.subplot(320+idx+1,axisbg=color)
9、plt.show(),plt.subplot(221)#,第一行的左图,plt.subplot(222)#,第一行的右图,plt.subplot(212)#,第二整行,plt.show(),快速绘图,当绘图对象中有多个轴的时候,可以通过工具栏中的,Configure Subplots,按钮,交互式地调节轴之间的间距和轴与边框之间的距离。如果希望在程序中调节的话,可以调用,subplots_adjust,函数,它有,left,right,bottom,top,wspace,hspace,等几个关键字参数,这些参数的值都是,0,到,1,之间的小数,它们是以绘图区域的宽高为,1,进行正规化之后的坐
10、标或者长度。,15,快速绘图,subplot(),返回它所创建的,Axes,对象,可以将它用变量保存起来,然后用,sca(),交替让它们成为当前,Axes,对象,并调用,plot(),在其中绘图。如果需要同时绘制多幅图表,可以给,figure(),传递一个整数参数指定,Figure,对象的序号,如果序号所指定的,figure,对象已经存在,将不创建新的对象,而只是让它成为当前的,Figure,对象。下面的程序演示了如何依次在不同图表的不同 子图中绘制曲线。,(matplotlib_multi_figure.py),16,快速绘图,首先通过,figure(),创建了两个图表,它们的序号分别为,1
11、和2。然后在图表,2,中创建了上下 并排的两个子图,并用变量,ax1,和,ax2,保存。,17,import numpy as np,import matplotlib.pyplot as plt,plt.figure(1)#,创建图表,1,plt.figure(2)#,创建图表,2,ax1=plt.subplot(211)#,在图表,2,中创建子图,1,ax2=plt.subplot(212)#,在图表,2,中创建子图,2,x=np.linspace(0,3,100),快速绘图,在循环中,先调用,figure(1),让图表,1,成为当前图表,并在其中绘图。然后调用,sca(ax1),和,s
12、ca(ax2),分别让子图,ax1,和,ax2,成为当前子图,并在其中绘图。当它们成为当前子图时,包含它们的图表,2,也自动成为当前图表,因此不需要调用,figure(2),依次在图表,1,和图表,2,的两 个子图之间切换,逐步在其中添加新的曲线,18,for i in xrange(5):,plt.figure(1)#,选择图表,1,plt.plot(x,np.exp(i*x/3),plt.sca(ax1)#,选择图表,2,的子图,1,plt.plot(x,np.sin(i*x),plt.sca(ax2)#,选择图表,2,的子图,2,plt.plot(x,np.cos(i*x),plt.sh
13、ow(),快速绘图,19,快速绘图,坐标轴设定,Axis,容器包括坐标轴的刻度线、刻度标签、坐标网格以及坐标轴标题等内容。刻度包括主刻度和副刻度,分别通过,get_major_ticks(),和,get_minor_ticks(),方法获得。每个刻度线都是一 个,XTick,或,YTick,对象,它包括实际的刻度线和刻度标签。为了方便访问刻度线和文本,,Axis,对象提供了,get_ticklabels(),和,get_ticklines(),方法,可以直接获得刻度标签和刻度线。下面例子进行绘图并得到当前子图的X轴对象,axis:,20,plt.plot(1,2,3,4,5,6),plt.sh
14、ow(),axis=plt.gca().xaxis,快速绘图,获得,axis,对象,的刻度位置列表:,下面获得,axis,对象的刻度标签以及标签中的文字:,21,axis.get_ticklocs(),array(1.,1.5,2.,2.5,3.),axis.get_ticklabels()#,获得刻度标签列表,x.get_text()for x in axis.get_ticklabels(),#,获得刻度的文本字符串,u1.0,u1.5,u2.0,u2.5,u3.0,快速绘图,22,快速绘图,下面获得,X,轴,上,表示主刻度线的列表,,可,看到,X,轴上共有,10,条刻度线,由于没有副刻度
15、线,因此副刻度线列表的长度为,0,:,使用,pyplot,模块中的,xticks(),能够完成,X,轴上刻度标签的配置:,23,axis.get_ticklines(),axis.get_ticklines(minor=True)#,获得副刻度线列表,plt.xticks(fontsize=16,color=red,rotation=45),快速绘图,上面的例子中副刻度线列表为空,这是因为用于计算副刻度位置的对象默认为,NullLocator,它不产生任何刻度线。而计算主刻度位置的对象为,AutoLocator,它会根据当前的缩放等配置自动计算刻度的位置,.,matplotlib,提供了多种配
16、置刻度线位置的,Locator,类,以及控制刻度标签显示的,Formatter,类。下面的程序设置X轴的主刻度为,/4,副刻度为,/20,并且主刻度上的标签用数学符号显示,。,(matplotlib_axis_text.py,自定义坐标轴的刻度和文字,),24,快速绘图,与刻度定位和文本格式化相关的类都在,matplotlib.ticker,模块中定义,程序从中载入了两个类:,MultipleLocaton,FuncFormatter.,25,from matplotlib.ticker import MultipleLocator,FuncFormatter,import matplotli
17、b.pyplot as pl,from matplotlib.ticker import MultipleLocator,FuncFormatter,import numpy as np,x=np.arange(0,4*np.pi,0.01),y=np.sin(x),pl.figure(figsize=(8,4),pl.plot(x,y),ax=pl.gca(),快速绘图,程序中通过,pi_formatter(),计算出刻度值对应的刻度文本,.,(很繁琐),26,def pi_formatter(x,pos):,m=np.round(x/(np.pi/4),n=4,while m!=0 and
18、 m%2=0:m,n=m/2,n/2,if m=0:,return 0,if m=1 and n=1:,return$pi$,if n=1:,return r$%d pi$%m,if m=1:,return r$fracpi%d$%n,return r$frac%d pi%d$%(m,n),快速绘图,27,X=np.linspace(0,4*np.pi,17,endpoint=True),X,array(0.,0.78539816,1.57079633,2.35619449,3.14159265,3.92699082,4.71238898,5.49778714,6.28318531,7.068
19、58347,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$
20、r$3pi/4$,r$pi$,r$5pi/4$,r$3pi/2$,r$7pi/4$,r$2pi$,r$9pi/4$,r$5pi/2$,r$11pi/4$,r$3pi$,r$13pi/4$,r$7pi/2$,r$15pi/4$,r$4pi$),#r$frac2pi3$,快速绘图,以指定值的整数倍为刻度放置主、副刻度线。,使用指定的函数计算刻度文本,它会将刻度值和刻度的序号作为参数传递给计算刻度文本的函数,.,28,ax.xaxis.set_major_locator(MultipleLocator(np.pi/4),ax.xaxis.set_minor_locator(MultipleLoca
21、tor(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/4,ax.xaxis.set_major_locator(MultipleLocator(np.pi/4),#,主刻度文本用,pi_formatter,函数计算,ax.xaxis.set_major_for
22、matter(FuncFormatter(pi_formatter),#,副刻度为,pi/20,ax.xaxis.set_minor_locator(MultipleLocator(np.pi/20),#,设置刻度文本的大小,for tick in ax.xaxis.get_major_ticks():,tick.label1.set_fontsize(16),pl.show(),快速绘图,30,绘图函数简介,对数坐标图,前面介绍过如何使用,plot(),绘制曲线图,所绘制图表的,X-Y,轴坐标都是算术坐标。下面看看如何在对数坐标系中绘图。,绘制对数坐标图的函数有三个:,semilogx()、
23、semilogy(),和,loglog(),它们分别绘制X轴为对数坐标、,Y,轴为对数坐标以及两个轴都为对数坐标时的图表。,31,绘图函数简介,下面的程序使用4种不同的坐标系绘制低通滤波器的频率响应曲线。其中,左上图为,plot(),绘制的算术坐标系,右上图为,semilogx(),绘制的X轴对数坐标系,左下图 为,semilogy(),绘制的,Y,轴对数坐标系,右下图为,loglog(),绘制的双对数坐标系。使用双对数坐标系表示的频率响应曲线通常被称为波特图。,(matplotlib_log.py),32,import numpy as np,import matplotlib.pyplot
24、 as plt,w=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,
25、linewidth=2),plt.ylim(0,1.5),plt.show(),绘图函数简介,34,绘图函数简介,极坐标图,极坐标系是和笛卡尔,(X-Y),坐标系完全不同的坐标系,极坐标系中的点由一个夹角和一段相对中心点的距离来表示。下面的程序绘制极坐标图,(,matplotlib_polar.py,)。,35,import numpy as np,import matplotlib.pyplot as plt,theta=np.arange(0,2*np.pi,0.02),绘图函数简介,程序中,调用,subplot(),创建子图时通过设,polar,参数为,True,创建一个极坐标子图。然后
26、调用,plot(),在极坐标,子图,中绘,图,。也,可,以使用,polar(),直接,创建极坐标子图并在其中绘制曲线。,36,plt.subplot(121,polar=True),plt.plot(theta,1.6*np.ones_like(theta),linewidth=2),plt.plot(3*theta,theta/3,-,linewidth=2),绘图函数简介,rgrids(),设置,同心,圆,栅格的半径,大,小和文字标注的角度。因此右图中的虚线圆圈有三个,半径分别为0.5、,1,.0和,1.5,这些文字沿着45线排列。,Thetagrids(),设置,放射线栅格的角度,因此右
27、图,中只有两条放射线,角度分别为0和45。,37,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,绘图函数简介,柱状图,柱状图用其每根柱子的长度表示值的,大,小,它们通常用来比较两组或多组值。下面的程序从文件中读入中国人口的年
28、龄分布数据,并使用柱状图比较男性和女性的年龄分布,。(,matplotlib_bar.py,绘制比较男女人口的年龄分布图,),39,import numpy as np,import matplotlib.pyplot as plt,绘图函数简介,读入的数据中,第0列为年龄,它将作为柱状图的横坐标。首先计算柱状图中每根柱子 的宽度,因为要在每个年龄段上绘制两根柱子,因此柱子的宽度应该小于年龄段的二分之 一。这里以年龄段的,0.4,倍作为柱子的宽度。,40,data=np.loadtxt(china_population.txt),width=(data1,0-data0,0)*0.4,绘图函数
29、简介,调用,bar(),绘制男性人口分布的柱状图。它的第一个参数为每根柱子左边缘的横坐标,为 了让男性和女性的柱子以年龄刻度为中心,这里让每根柱子左侧的横坐标为“年龄减去柱子的宽度”。,Bar(),的第二个参数为每根柱子的高度,第三个参数指定所有柱子的宽度。当第三个参数为序列时,可以为每根柱子指定宽度。,41,plt.figure(figsize=(8,5),plt.bar(data:,0-width,data:,1/1e7,width,color=b,label=u,男,),绘图函数简介,绘制女性人口分布的柱状图,这里以年龄为柱子的左边缘横坐标,因此女性和男性的人 口分布图以年龄刻度为中心。
30、由于,bar(),不自动修改颜色,因此程序中通过,color,参数设置两个 柱状图的颜色。,42,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,绘图函数简介,散列图,使用,plot(),绘图时,如果指定样式参数为仅绘制数据点,那么所绘制的就是一幅散列图。例如:,但是这种方法所绘制的点无法单独指定颜色和大小。而,scatter(),所绘制的散列图却
31、可以指定每个点的颜色和大小。下面的程序演示,scatter(),的用法(,matplotlib_scatter.py).,44,plt.plot(np.random.random(100),np.random.random(100),o),绘图函数简介,scatter(),的前两个参数是数组,分别指定每个点的X轴和,Y,轴的坐标。,s,参数指定点的大 小,值和点的面积成正比。它可以是一个数,,45,import numpy as np,import matplotlib.pyplot as plt,plt.figure(figsize=(8,4),x=np.random.random(100)
32、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(),绘图函数简介,指定所有点的大小;也可以是数组,分别对每个点指定大小。,c,参数指定每个点的颜色,可以是数值或数组。这里使用一维数组为每个点指定了一个数值。通过颜色映射表,每个数值都会与一个颜色相对应。默认的颜色映射表中蓝色与最小值对应,红色与最,大,值对应。当,c,参数是形状为,(N,3),或,(N,4),的二维数组时,则
33、直接表示每个点的,RGB,颜色。,marker,参数,设置,点的形状,可以是个表示形状的字符串,也可以是表示多边形的两个,元素,的元组,第一个元素表示多边形的边数,,46,绘图函数简介,第二个元素表示多边形的样式,取值范围为0、1、2、3。0表示多边形,1表示星形,2表示放射形,3表示忽略边数而显示为圆形。,最后,通过,alpha,参数设置点的透明度,通过,lw,参数设置线宽,,lw,是,line width,的缩写。,facecolors,参数为,“none”,时,表示散列点没有填充色。,47,绘图函数简介,48,绘图函数简介,图像,imread(),和,imshow(),提供了简单的图像载
34、入和显示功能,.,imread(),可,以从,图,像文件读入数据,得到一个表示图像的,NumPy,数组。它的第一个参数是文件名或文件对象,,format,参数指定图像类型,如果省略,就由文件的扩展名决定图像类型。对于灰度图像,它返回一个形状为,(M,,,N),的数组;对于彩色图像,返冋形状为,(M,,,N,,,C),的数组。其中,M,为图像的,高,度,N,为图像的宽度,C,为3或4,表示图像的通道数。,49,img=plt.imread(“lena.jpg“),绘图函数简介,下面的程序从“,lena.jpg,”中读入图像数据,得到的数组,img,是一个形状为(393,512,3),的单字节无符
35、号整数数组。这是因为通常使用的图像都是采用单字节分别保存每个像素的红、绿、蓝三个通道的分量:,50,img=plt.imread(lena.jpg),img.shape,(393L,512L,3L),img.dtype,dtype(uint8),绘图函数简介,imshow(),可以用来显示,imread(),返,回,的数组。如果数组是表示多通道图像的三维数组,那么每个像素的颜色由各个通道的值决定:,请注意,从,JPG,图像中读入的数据是上下颠倒的,,为了正常显示图像,可以将数组的第,0,轴反转,或者设置,imshow(),的,origin,参数为,“lower”,从而让所显示图表的原点在左下角
36、51,plt.imshow(img)#,注意图像是上下颠倒的,plt.imshow(img:-1)#,反转图像数组的第,0,轴,#or,plt.imshow(img,origin=lower)#,让图表的原点在左下角,绘图函数简介,如果三维数组的元素类型为浮点数,那么元素的取值范围为,0.0,到,1.0,与颜色值0到255 对应。超出这个范围可能会出现颜色异常的像素。下面的例子将数组,img,转换为浮点数组并用,imshow(),进行显示:,52,img=img:-1,plt.imshow(img*1.0)#,取值范围为,0.0,到,255.0,的浮点数组,不能正确显示颜色,plt.ims
37、how(img/255.0)#,取值范围为,0.0,到,1.0,的浮点数组,能正确显示颜色,plt.imshow(np.clip(img/200.0,0,1)#,使用,clip(),限制取值范围,整个图像变亮,绘图函数简介,如果,imshow(),的参数是二维数组,就使用颜色映射表决定每个像素的颜色。下面显示图像中的红色通道:,显示效果比较吓人,因为默认的图像映射将最小值映射为蓝色、将最大值映射为红色,.,可以使用,colorbar(),将颜色映射表在图表中显示出来:,53,plt.imshow(img:,:,0),plt.colorbar(),绘图函数简介,通过,imshow(),的,cma
38、p,参数可以修改显示图像时所采用的颜色映射表。颜色映射表是一个,ColorMap,对象,,matplotlib,中已经预先定义好了很多颜色映射表,可通过下面的语句找到这 些颜色映射表的名,字:,(matplotlib_imshow.py),下面使用名为,copper,的颜色映射表显示图像的红色通道,很有老照片的味道,:,54,import matplotlib.cm as cm,cm._cmapnames,Spectral,copper,RdYlGn,Set2,sumner,spring,gist_ncar,,plt.imshow(img:,:,0,cmap=cm.copper),绘图函数简介
39、55,import numpy as np,import matplotlib.pyplot as plt,import matplotlib.cm as cm,plt.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(
40、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(),for ax in plt.gcf().axes:,ax.set_axis_off(),ax.set_axis_off(),plt.show
41、),绘图函数简介,57,绘图函数简介,还可以使用,imshow(),显示任意的二维数据,例如下面的程序使用图像直观地显示了二元函数,.(matplotlib_2dfunc.py,使用,imshow(),可视化二元函数,),58,import numpy as np,import matplotlib.pyplot as plt,import matplotlib.cm as cm,y,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),绘图函数简介,
42、首先通过数组的广播功能计算出表示函数值的二维数组,Z,注意它的第0轴表示,Y,轴、第1轴表示X轴。然后将X、,Y,轴的取值范围保存到,extent,列表中。,59,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(),绘图函数简介,将,extent,列表传递给,
43、imshow(),的,extent,参数,这样一来,图表的X、,Y,轴的刻度标签将使用,extent,列表所指定的范围,.,60,绘图函数简介,等值线图,还可以使用等值线图表示二元函数。所谓等值线,是指由函数值相等的各点连成的平滑曲线。等值线可以直观地表示二元函数值的变化趋势,例如等值线密集的地方表示函数值在此处的变化较大。,matplotlib,中可以使用,contour(),和,contourf(),描绘等值线,它们的区别是:,contourf(),所得到的是带填充效果的等值线。,(matplotlib_contour.py,用,contour,和,contourf,描绘等值线图,),61
44、绘图函数简介,62,import numpy as np,import matplotlib.pyplot as plt,y,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
45、reshape(-1),z,20),plt.show(),绘图函数简介,为了更淸楚地区分X轴和,Y,轴,这里让它们的取值范围和等分次数均不相同,.,这样得 到的数组,z,的形状为,(200,300),它的第0轴对应,Y,轴、第1轴对应X轴。,调用,contour(),绘制数组,z,的等值线图,第二个参数为10,表示将整个函数的取值范围等 分为10个,区间,即显示的等值线图中将有9条等值线。和,imshow(),一,样,可以使用,extent,参 数指定等值线图的X轴和,Y,轴的数据范围。,contour(),所返回的是一个,QuadContourSet,对象,将它传递给,clabel(),为
46、其中的等值线标上对应的值。,63,绘图函数简介,调用,contourf(),绘制将取值范围等分为20份、带填充效果的等值线图。这里演示 了另外一种设置X、,Y,轴取值范围的方法。它的前两个参数分别是计算数组,z,时所使用的X轴和,Y,轴上的取样点,这两个数组必须是一维的。,64,绘图函数简介,还可以使用等值线绘制隐函数曲线,.,显然,无法像绘制一般函数那样,先创建一个等差数组表示变,量,的取值点,然后计算出数组中每个,x,所对应的,y,值。可以使用等值线解决这个问题,显然隐函数的曲线就是值等于0的那条等值线。下面的程序绘制函数,在,f(x,y)=0,和,f(x,y)-0.1,=0时的曲线,.(
47、matplotlib_implicit_func.py),65,import numpy as np,import matplotlib.pyplot as plt,y,x=np.ogrid-1.5:1.5:200j,-1.5:1.5:200j,f=(x*2+y*2)*4-(x*2-y*2)*2,绘图函数简介,66,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
48、r,linestyles=solid,dashed,linewidths=2,2),plt.subplot(122),for c in cs.collections:,data=c.get_paths()0.vertices,plt.plot(data:,0,data:,1,color=c.get_color()0,linewidth=c.get_linewidth()0),plt.show(),绘图函数简介,67,绘图函数简介,在调用,contour(),绘制等值线时,可以通过,levels,参数指定所绘制等值线对应的函数值,这 里设置,levels,参数为0,,0.1,因此最终将绘制两条
49、等值线。,观察图,会,发现,表示隐函数,f(x)=0,蓝色实线并不是完全连续的,在图的中间部分它由许多孤立的小段构成。因为等值线在原点附近无限靠近,因此无论对函数,f,的取值空间如何进行细分,总是会有无法分开的地方,,最终,造成了图中的那些孤立的细小区域。而表示隐函数,f(x,y)-0.1=0,的红色虚线则是闭合且连续的。,68,绘图函数简介,可以通过,contour(),返回的对象获得等值线上每点的数据,下面在,IPython,中观察,变量,cs,它是一个,QuadContourSet,对象:,cs,对象的,collections,属性是一个等值线列表,每条等值线用一个,LineCollec
50、tion,对象表,示:,69,cs.collections,run matplotlib_implicit_func.py,cs,绘图函数简介,每个,LineCollection,对象都有它自己的颜色、线型、线宽等属性,注意这些属性所获得的结果外面还有一层封装,要获得其第0个元素才是真正的配置:,由类名可知,,LineCollection,对象是一组曲线的集合,因此它可以表示像蓝色实线那样由多条线构成的等值线。它的,get_paths(),方法获得构成等值线的所有路径,本例中蓝色实线,70,c.get_color()0,array(1.,0.,0.,1.),c.get_linewidth()0