《7.Python科学计算与数据处理(PPT82页)》由会员分享,可在线阅读,更多相关《7.Python科学计算与数据处理(PPT82页)(84页珍藏版)》请在金锄头文库上搜索。
1、Matplotlib绘制精美的图表1目录o快速绘图n快速绘图n绘制多轴图n坐标轴设定o绘图函数简介n对数坐标图n极坐标图n柱状图n散列图 2目录n图像n等值线图n三维绘图34快速绘图o快速绘图 matplotlib的pyplot子库提供了和matlab类似的绘图API,方便用户快速绘制2D图表。(matplotlib_simple_plot.py) pylab模块 matplotlib还提供了名为pylab的模块,其中包括了许多numpy和pyplot中常用的函数,方便用户快速进行计算和绘图,可以用于IPython中的快速交互式使用。 5快速绘图 matplotlib中的快速绘图的函数库可以通
2、过如下语句载入: 接下来调用figure创建一个绘图对象,并且使它成为当前的绘图对象。 通过figsize参数可以指定绘图对象的宽度和高度,单位为英寸;dpi参数指定绘图对象的分辨率,即每英寸多少个像素,缺省值为80。因此本例中所创建的图表窗口的宽度为8*80 = 640像素。import matplotlib.pyplot as plt plt.figure(figsize=(8,4)6快速绘图 也可以不创建绘图对象直接调用接下来的plot函数直接绘图,matplotlib会自动创建一个绘图对象。 如果需要同时绘制多幅图表的话,可以是给figure传递一个整数参数指定图标的序号,如果所指定序
3、号的绘图对象已经存在的话,将不创建新的对象,而只是让它成为当前绘图对象。 下面的两行程序通过调用plot函数在当前的绘图对象中进行绘图:plt.plot(x,y,label=$sin(x)$,color=red,linewidth=2)plt.plot(x,z,b-,label=$cos(x2)$)7快速绘图 plot函数的调用方式很灵活,第一句将x,y数组传递给plot之后,用关键字参数指定各种属性:n label : 给所绘制的曲线一个名字,此名字在图示(legend)中显示。只要在字符串前后添加$符 号,matplotlib就会使用其内嵌的latex引擎绘制的数学公式。n color :
4、 指定曲线的颜色n linewidth : 指定曲线的宽度n第三个参数b-指定曲线的颜色和线型plt.plot(x,y,label=$sin(x)$,color=red,linewidth=2)plt.plot(x,z,b-,label=$cos(x2)$“)8快速绘图 接下来通过一系列函数设置绘图对象的各个属性:n xlabel / ylabel : 设置X轴/Y轴的文字n title : 设置图表的标题n ylim : 设置Y轴的范围n legend : 显示图示 最后调用plt.show()显示出创建的所有绘图对象。plt.xlabel(Time(s)plt.ylabel(Volt)pl
5、t.title(PyPlot First Example)plt.ylim(-1.2,1.2)plt.legend()9快速绘图o import numpy as npimport matplotlib.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)
6、plt.ylabel(Volt) plt.title(PyPlot First Example) plt.ylim(-1.2,1.2) plt.legend() plt.show()10快速绘图11快速绘图 还可以调用plt.savefig()将当前的Figure对象保存成图像文件,图像格式由图像文件的扩展名决定。下面的程序将当前的图表保存为“test.png”,并且通过dpi参数指定图像的分辨率为 120,因此输出图像的宽度为“8X120 = 960”个像素。 实际上不需要调用show()显示图表,可以直接用savefig()将图表保存成图像文件.使用这种方法可以很容易编写出 批量输出图表的
7、程序.run matplotlib_simple_plot.pyplt.savefig(test.png,dpi=120)12快速绘图o绘制多轴图 一个绘图对象(figure)可以包含多个轴(axis),在Matplotlib中用轴表示一个绘图区域,可以将其理解为子图。上面的第一个例子中,绘图对象只包括一个轴,因此只显示了一个轴(子图(Axes) )。可以使用subplot函数快速绘制有多个轴的图表。subplot函数的调用形式如下:subplot(numRows, numCols, plotNum)13快速绘图 subplot将整个绘图区域等分为numRows行和 numCols列个子区域,
8、然后按照从左到右,从上到下的顺序对每个子区域进行编号,左上的子区域的编号为1。如果numRows,numCols和plotNum这三个数都小于10的话,可以把它们缩写为一个整数,例如subplot(323)和subplot(3,2,3)是相同的。subplot在plotNum指定的区域中创建一个轴对象。如果新创建的轴和之前创建的轴重叠的话,之前的轴将被删除。14快速绘图 下面的程序创建3行2列共6个轴,通过axisbg参数给每个轴设置不同的背景颜色。 如果希望某个轴占据整个行或者列的话,可以如下调用subplot:for idx, color in enumerate(rgbyck): plt
9、.subplot(320+idx+1, axisbg=color)plt.show()plt.subplot(221) # 第一行的左图plt.subplot(222) # 第一行的右图plt.subplot(212) # 第二整行plt.show()15快速绘图 当绘图对象中有多个轴的时候,可以通过工具栏中的Configure Subplots按钮,交互式地调节轴之间的间距和轴与边框之间的距离。如果希望在程序中调节的话,可以调用subplots_adjust函数,它有left, right, bottom, top, wspace, hspace等几个关键字参数,这些参数的值都是0到1之间的
10、小数,它们是以绘图区域的宽高为1进行正规化之后的坐标或者长度。16快速绘图 subplot()返回它所创建的Axes对象,可以将它用变量保存起来,然后用sca()交替让它们成为当前Axes对象,并调用plot()在其中绘图。如果需要同时绘制多幅图表,可以给figure()传递一个整数参数指定Figure对象的序号,如果序号所指定的figure对象已经存在,将不创建新的对象,而只是让它成为当前的Figure对象。下面的程序演示了如何依次在不同图表的不同 子图中绘制曲线。 (matplotlib_multi_figure.py)17快速绘图 首先通过figure()创建了两个图表,它们的序号分别为
11、1和2。然后在图表2中创建了上下 并排的两个子图,并用变量ax1和ax2保存。import numpy as npimport matplotlib.pyplot as pltplt.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和a
12、x2成为当前子图,并在其中绘图。当它们成为当前子图时,包含它们的图表2也自动成为当前图表,因此不需要调用figure(2)依次在图表1和图表2的两 个子图之间切换,逐步在其中添加新的曲线 for i in xrange(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快速绘图o坐标轴设定 Axis容器包括坐标轴的刻度线、刻
13、度标签、坐标网格以及坐标轴标题等内容。刻度包括主刻度和副刻度,分别通过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
14、对象的刻度标签以及标签中的文字: 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快速绘图23快速绘图 下面获得X轴上表示主刻度线的列表,可看到X轴上共有10条刻度线 由于没有副刻度线,因此副刻度线列表的长度为0: 使用pyplot模块中的xticks()能够完成X轴上刻度标签的配置: axis.get_
15、ticklines() axis.get_ticklines(minor=True) # 获得副刻度线列表plt.xticks(fontsize=16, color=red, rotation=45)24快速绘图 上面的例子中副刻度线列表为空,这是因为用于计算副刻度位置的对象默认为 NullLocator,它不产生任何刻度线。而计算主刻度位置的对象为AutoLocator,它会根据当前的缩放等配置自动计算刻度的位置. matplotlib提供了多种配置刻度线位置的Locator类,以及控制刻度标签显示的Formatter 类。下面的程序设置X轴的主刻度为/4,副刻度为 /20,并且主刻度上的标
16、签用数学符号显示 。( matplotlib_axis_text.py自定义坐标轴的刻度和文字)25快速绘图 与刻度定位和文本格式化相关的类都在matplotlib.ticker模块中定义,程序从中载入了两个类:MultipleLocaton, FuncFormatter. from matplotlib.ticker import MultipleLocator, FuncFormatterimport matplotlib.pyplot as plfrom matplotlib.ticker import MultipleLocator, FuncFormatter import nump
17、y as npx = 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()计算出刻度值对应的刻度文本.(很繁琐)def pi_formatter(x, pos): m = np.round(x / (np.pi/4)n = 4while m!=0 and m%2=0: m, n = m/2, n/2if m = 0:return 0if m = 1 and n = 1:return $pi$if n = 1:retur
18、n r$%d pi$ % mif m = 1:return r$fracpi%d$ % nreturn r$frac%d pi%d$ % (m,n)27快速绘图o 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
19、.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$3pi/4$, r$pi$, r$5pi/4$, r
20、$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( MultipleLocator(np.pi/20) )a
21、x.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( FuncFor
22、matter( pi_formatter ) ) # 副刻度为pi/20ax.xaxis.set_minor_locator( MultipleLocator(np.pi/20) )# 设置刻度文本的大小for tick in ax.xaxis.get_major_ticks():tick.label1.set_fontsize(16)pl.show()30快速绘图 31绘图函数简介o对数坐标图 前面介绍过如何使用plot()绘制曲线图,所绘制图表的X-Y轴坐标都是算术坐标。下面看看如何在对数坐标系中绘图。 绘制对数坐标图的函数有三个:semilogx()、semilogy()和loglog(
23、),它们分别绘制X轴为对数坐标、Y轴为对数坐标以及两个轴都为对数坐标时的图表。 32绘图函数简介 下面的程序使用4种不同的坐标系绘制低通滤波器的频率响应曲线。 其中,左上图为plot()绘制的算术坐标系,右上图为semilogx()绘制的X轴对数坐标系,左下图 为semilogy()绘制的Y轴对数坐标系,右下图为loglog()绘制的双对数坐标系。使用双对数坐标系表示的频率响应曲线通常被称为波特图。(matplotlib_log.py) import numpy as npimport matplotlib.pyplot as pltw = np.linspace(0.1, 1000, 100
24、0)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()
25、34绘图函数简介 35绘图函数简介o极坐标图 极坐标系是和笛卡尔(X-Y)坐标系完全不同的坐标系,极坐标系中的点由一个夹角和一段相对中心点的距离来表示。下面的程序绘制极坐标图, (matplotlib_polar.py)。 import numpy as npimport matplotlib.pyplot as plttheta = np.arange(0, 2*np.pi, 0.02)36绘图函数简介 程序中调用subplot()创建子图时通过设 polar参数为True,创建一个极坐标子图。然后调用plot()在极坐标子图中绘图。也可以使用polar()直接创建极坐标子图并在其中绘制曲线
26、。 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,
27、 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绘图函数简介o柱状图 柱状图用其每根柱子的长度表示值的大小,它们通常用来比较两组或多组值。下面的程序从文件中读入中国人口的年龄分布数据,并使用柱状图比较男性和女性的年龄分布。(matplotlib_bar.py 绘制比较男女人口的年龄分布图 )impor
28、t numpy as npimport matplotlib.pyplot as plt40绘图函数简介 读入的数据中,第0列为年龄,它将作为柱状图的横坐标。首先计算柱状图中每根柱子 的宽度,因为要在每个年龄段上绘制两根柱子,因此柱子的宽度应该小于年龄段的二分之 一。这里以年龄段的0.4倍作为柱子的宽度。 data = np.loadtxt(china_population.txt)width = (data1,0 - data0,0)*0.4 41绘图函数简介 调用bar()绘制男性人口分布的柱状图。它的第一个参数为每根柱子左边缘的横坐标,为 了让男性和女性的柱子以年龄刻度为中心,这里让每根
29、柱子左侧的横坐标为“年龄减去柱子的宽度”。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, w
30、idth, color=r, label=u女) plt.xlim(-width, 100)plt.xlabel(u年龄)plt.ylabel(u人口(千万))plt.legend()plt.show()43绘图函数简介 44绘图函数简介o散列图 使用plot()绘图时,如果指定样式参数为仅绘制数据点,那么所绘制的就是一幅散列图。 例如: 但是这种方法所绘制的点无法单独指定颜色和大小。而scatter()所绘制的散列图却可以指定每个点的颜色和大小。下面的程序演示scatter()的用法 (matplotlib_scatter.py).plt.plot(np.random.random(100)
31、, np.random.random(100), o)45绘图函数简介 scatter()的前两个参数是数组,分别指定每个点的X轴和Y轴的坐标。s参数指定点的大 小,值和点的面积成正比。它可以是一个数,import numpy as npimport matplotlib.pyplot as pltplt.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=
32、none)plt.xlim(0,1)plt.ylim(0,1)plt.show()46绘图函数简介 指定所有点的大小;也可以是数组,分别对每个点指定大小。 c参数指定每个点的颜色,可以是数值或数组。这里使用一维数组为每个点指定了一个数值。通过颜色映射表,每个数值都会与一个颜色相对应。默认的颜色映射表中蓝色与最小值对应,红色与最大值对应。当c参数是形状为(N,3)或(N,4)的二维数组时,则直接表示每个点的RGB颜色。 marker参数设置点的形状,可以是个表示形状的字符串,也可以是表示多边形的两个元素的元组,第一个元素表示多边形的边数,47绘图函数简介 第二个元素表示多边形的样式,取值范围为0
33、、1、2、3。0表示多边形,1表示星形,2表示放射形,3表示忽略边数而显示为圆形。 最后,通过alpha参数设置点的透明度,通过lw参数设置线宽,lw是line width的缩写。 facecolors参数为“none”时,表示散列点没有填充色。48绘图函数简介49绘图函数简介o图像 imread()和imshow()提供了简单的图像载入和显示功能. imread()可以从图像文件读入数据,得到一个表示图像的NumPy数组。它的第一个参数是文件名或文件对象,format参数指定图像类型,如果省略,就由文件的扩展名决定图像类型。 对于灰度图像,它返回一个形状为(M,N)的数组;对于彩色图像,返冋
34、形状为(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()返回的数
35、组。如果数组是表示多通道图像的三维数组,那么每个像素的颜色由各个通道的值决定: 请注意,从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 对应。超出这个范围可能会
36、出现颜色异常的像素。下面的例子将数组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()的参数是二维数组,就使用颜色映射表决定每个像素的颜色。下面显示图像中的红色通道: 显示效果比较吓人,因为默认的图像映射将最小
37、值映射为蓝色、将最大值映射为红色. 可以使用colorbar()将颜色映射表在图表中显示出来: plt.imshow(img:,:,0) plt.colorbar()54绘图函数简介 通过imshow()的cmap参数可以修改显示图像时所采用的颜色映射表。颜色映射表是一个 ColorMap对象,matplotlib中已经预先定义好了很多颜色映射表,可通过下面的语句找到这 些颜色映射表的名字:(matplotlib_imshow.py) 下面使用名为copper的颜色映射表显示图像的红色通道,很有老照片的味道: import matplotlib.cm as cm cm._cmapnamesSp
38、ectral,copper, RdYlGn, Set2, sumner, spring, gist_ncar,plt.imshow(img:,:,0,cmap=cm.copper)55绘图函数简介o import numpy as npimport matplotlib.pyplot as pltimport matplotlib.cm as cmplt.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
39、:-1)plt.subplot(333)plt.imshow(img, origin=lower)img = img:-1plt.subplot(334)plt.imshow(img*1.0)56绘图函数简介o 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.
40、colorbar()for ax in plt.gcf().axes:ax.set_axis_off()ax.set_axis_off()plt.show()57绘图函数简介58绘图函数简介 还可以使用imshow()显示任意的二维数据,例如下面的程序使用图像直观地显示了二元函数 . (matplotlib_2dfunc.py 使用imshow()可视化二元函数) import numpy as npimport matplotlib.pyplot as pltimport matplotlib.cm as cmy, x = np.ogrid-2:2:200j, -2:2:200jz = x
41、* 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, cma
42、p=cm.gray, origin=lower)plt.colorbar()plt.show()60绘图函数简介 将extent列表传递给 imshow()的extent参数,这样一来,图表的X、Y轴的刻度标签将使用extent列表所指定的范围.61绘图函数简介o等值线图 还可以使用等值线图表示二元函数。所谓等值线,是指由函数值相等的各点连成的平滑曲线。等值线可以直观地表示二元函数值的变化趋势,例如等值线密集的地方表示函数值在此处的变化较大。matplotlib中可以使用contour()和contourf()描绘等值线,它们的区别是:contourf()所得到的是带填充效果的等值线。(mat
43、plotlib_contour.py用contour和contourf描绘等值线图) 62绘图函数简介 import numpy as npimport matplotlib.pyplot as plty, 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
44、.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()所返回的
45、是一个QuadContourSet对象, 将它传递给clabel(),为其中的等值线标上对应的值。 64绘图函数简介 调用contourf(),绘制将取值范围等分为20份、带填充效果的等值线图。这里演示 了另外一种设置X、Y轴取值范围的方法。它的前两个参数分别是计算数组z时所使用的X轴和Y轴上的取样点,这两个数组必须是一维的。65绘图函数简介 还可以使用等值线绘制隐函数曲线. 显然,无法像绘制一般函数那样,先创建一个等差数组表示变量的取值点,然后计算出数组中每个x所对应的y值。可以使用等值线解决这个问题,显然隐函数的曲线就是值等于0的那条等值线。下面的程序绘制函数 在f(x,y)=0和 f(x
46、,y)-0.1 = 0时的曲线. (matplotlib_implicit_func.py)import numpy as npimport matplotlib.pyplot as plty, x = np.ogrid-1.5:1.5:200j, -1.5:1.5:200jf = (x*2 + y*2)*4 - (x*2 - y*2)*266绘图函数简介o 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=e
47、xtent, levels=0, 0.1, colors=b, 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绘图函数简介68绘图函数简介 在调用contour()绘制等值线时,可以通过levels参数指定所绘制等值线对应的函数值,
48、这 里设置levels参数为0,0.1,因此最终将绘制两条等值线。 观察图会发现,表示隐函数f(x)=0蓝色实线并不是完全连续的,在图的中间部分它由许多孤立的小段构成。因为等值线在原点附近无限靠近,因此无论对函数f的取值空间如何进行细分,总是会有无法分开的地方,最终造成了图中的那些孤立的细小区域。而表示隐函数f(x,y)-0.1=0的红色虚线则是闭合且连续的。 69绘图函数简介 可以通过contour()返回的对象获得等值线上每点的数据,下面在IPython中观察变量cs,它是一个 QuadContourSet 对象: cs对象的collections属性是一个等值线列表,每条等值线用一个Li
49、neCollection对象表示: cs.collections run matplotlib_implicit_func.pycs70绘图函数简介 每个LineCollection对象都有它自己的颜色、线型、线宽等属性,注意这些属性所获得的结果外面还有一层封装,要获得其第0个元素才是真正的配置: 由类名可知,LineCollection对象是一组曲线的集合,因此它可以表示像蓝色实线那样由多条线构成的等值线。它的get_paths()方法获得构成等值线的所有路径,本例中蓝色实线 c.get_color()0array( 1., 0., 0., 1.) c.get_linewidth()0271
50、绘图函数简介所表示的等值线由42条路径构成: 路径是一个Path对象,通过它的vertices属性可以获得路径上所有点的坐标: len(cs.collections0.get_paths()42 path = cs.collections0.get_paths()0 type(path) path.verticesarray(-0.08291457, -0.98938936,-0.09039269, -0.98743719,-0.08291457, -0.98938936)72绘图函数简介 下面的程序从等值线集合cs中找到表示等值线的路径,并使用plot()将其绘制出来.plt.subplot
51、(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)73绘图函数简介o三维绘图 mpl_toolkits.mplot3d模块在matplotlib基础上提供了三维绘图的功能。由于它使用matplotlib的二维绘图功能来实现三维图形的绘制工作,因此绘图速度有限,不适合用于大规模数据的三维绘图。如果需要更复杂的三维数据可视化功能,可使用Mayavi。(matplotlib_
52、surface.py 使用matplotlib绘制三维曲面)74绘图函数简介o 演示matplotlib的三维绘图功能。import numpy as npimport mpl_toolkits.mplot3d import matplotlib.pyplot as pltx, y = np.mgrid-2:2:20j, -2:2:20j z = x * np.exp( - x*2 - y*2)ax = plt.subplot(111, projection=3d) ax.plot_surface(x, y, z, rstride=2, cstride=1, cmap = plt.cm.Blu
53、es_r) ax.set_xlabel(X)ax.set_ylabel(Y)ax.set_zlabel(Z)plt.show()75绘图函数简介76绘图函数简介 首先载入mplot3d模块,matplotlib中与三维绘图相关的功能均在此模块中定义。使用 mgrid创建X-Y平面的网格并计算网格上每点的高度z。由于绘制三维曲面的函数要求X、Y 和Z轴的数据都用相同形状的二维数组表示,因此这里不能使用ogrid创建。和之前的imshow() 不同.数组的第0轴可以表示X和Y轴中的任意一个,在本例中第0轴表示X轴、第1轴表示Y轴。 在当前图表中创建一个子图,通过projection参数指定子图的投
54、影模式为“3d”,这样 subplot()将返回一个用于三维绘图的Axes3D子图对象。77绘图函数简介 投影模式: 投影模式决定了点从数据坐标转换为屏幕坐标的方式.可以通过下面的语句获得当前有效的投影模式的名称: 只有在载入mplot3d模块之后,此列表中才会出現3d投影模式. aitoff、hammer, lamberf,mollweide等均为地图投影,,polar 为极坐标投影,rectilinear則是默认的直线投影模式. from matplotlib import projections projections.get_projection_names()3d, aitoff,
55、hammer, lambert, mollweide1, polar, rectilinear78绘图函数简介 调用Axes3D对象的plot_surface()绘制三维曲面。其中:参数x、y、z都是形状为(20,20) 的二维数组,数组x和y构成了 X-Y平面上的网格,而数组z则是网格上各点在曲面上的取值。 通过cmap参数来指定值和颜色之间的映射,即曲面上各点的高度值与其颜色的对应关系。rstride 和cstride参数分别是数组的第0轴和第1轴的下标间隔.对于很大的数组,使用较大的间隔可以提高曲面的绘制速度。程序中,plot_surfece()调用和下面的语句是等价的:ax.plot_
56、surface(x:2,:, y:2,:, z:2,:, rstride=1, cstride=1)79绘图函数简介80o from mpl_toolkits.mplot3d import Axes3Dfig = pl.figure()ax = Axes3D(fig)X = np.arange(-4, 4, 0.25)Y = np.arange(-4, 4, 0.25)X, Y = np.meshgrid(X, Y)R = np.sqrt(X*2 + Y*2)Z = np.sin(R)ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=hot)8182演讲完毕,谢谢观看!