1、matplotlib 绘图基础matplotlib 介绍matplotlib 是 Python 最著名的绘图库,它提供了一整套和 matlab 相似的命令 API,十分适合交互式地进行制图。而且也可以方便地将它作为绘图控件,嵌入 GUI 应用程序中。它的文档相当完备,并且 Gallery 页面 中有上百幅缩略图,打开之后都有源程序。因此如果你需要绘制某种类型的图,只需要在这个页面中浏览/复制/粘贴一下,基本上都能搞定。在 Linux 下比较著名的数据图工具还有 gnuplot,这个是免费的,Python 有一个包可以调用 gnuplot,但是语法比较不习惯,而且画图质量不高。而 Matplot
2、lib 则比较强:Matlab 的语法、python 语言、latex 的画图质量(还可以使用内嵌的 latex 引擎绘制的数学公式) 。可以在 Ipython 中输入类似“plt.plot?“的命令查看 pyplot 模块的函数是如何对各种绘图对象进行包装的。面向对象方式绘图matplotlib 实际上是一套面向对象的绘图库,它所绘制的图表中的每个绘图元素,例如线条 Line2D、文字 Text、刻度等在内存中都有一个对象与之对应。为了方便快速绘图 matplotlib 通过 pyplot 模块提供了一套和 MATLAB 类似的绘图 API,将众多绘图对象所构成的复杂结构隐藏在这套 API
3、内部。我们只需要调用 pyplot 模块所提供的函数就可以实现快速绘图以及设置图表的各种细节。pyplot 模块虽然用法简单,但不适合在较大的应用程序中使用。获取当前图和轴线为了将面向对象的绘图库包装成只使用函数的调用接口,pyplot 模块的内部保存了当前图表以及当前子图等信息。当前的图表和子图可以使用 plt.gcf()和 plt.gca()获得,分别表示“Get Current Figure“和“Get Current Axes“。在 pyplot 模块中,许多函数都是对当前的 Figure 或 Axes 对象进行处理,比如说: plt.plot()实际上会通过 plt.gca()获得当
4、前的 Axes 对象 ax,然后再调用ax.plot()方法实现真正的绘图。如,用下面的代码先获得 axes 对象再用 ax 来操作ax = plt.gca()ax = plt.axes()地如设置 xy 轴的 tickers 就要用 ax.yaxis 来操作ax.yaxis.set_minor_locator(yminorLocator)安装 numpy 和 matplotlibpip install numpypip install matplotlibmatplotlib 安装出错ImportError: libBLT.2.4.so.8.6: cannot open shared obj
5、ect file: No such file or directory, please install the python3-tk packageimport matplotlib.pyplot as plt fails with error about python-tk检测是否安装成功: import numpy numpy._version_ import matplotlib matplotlib._version_不同绘图语言比较工科生说 Matlab 完爆其他数学系的说 Mathematica 高贵冷艳统计系的说 R 语言作图领域天下无敌 计算机系的说 Python 低调奢华有内
6、涵如何在论文中画出漂亮的插图matplotlib.pyplot 模块 - 快速绘图matplotlib 的 pyplot 子库提供了和 matlab 类似的绘图 API,方便用户快速绘制 2D 图表。1.调用 figure 创建一个绘图对象,并且使它成为当前的绘图对象。 (可选)plt.figure(figsize=(8,4)也可以不创建绘图对象直接调用接下来的 plot 函数直接绘图,matplotlib 会为我们自动创建一个绘图对象!如果需要同时绘制多幅图表的话,可以是给 figure 传递一个整数参数指定图标的序号,如果所指定序号的绘图对象已经存在的话,将不创建新的对象,而只是让它成为当
7、前绘图对象。figsize 参数:指定绘图对象的宽度和高度,单位为英寸;dpi 参数指定绘图对象的分辨率,即每英寸多少个像素,缺省值为 80。因此本例中所创建的图表窗口的宽度为 8*80 = 640 像素。但是用 show()出来的工具栏中的保存按钮保存下来的 png 图像的大小是 800*400 像素。这是因为保存图表用的函数 savefig 使用不同的 DPI 配置,savefig 函数也有一个 dpi 参数,如果不设置的话,将使用 matplotlib 配置文件中的配置,此配置可以通过如下语句进行查看: matplotlib.rcParams“savefig.dpi“1002.通过调用
8、plot 函数在当前的绘图对象中进行绘图plt.plot(years, price, b*)#,label=“$cos(x2)$“)plt.plot(years, price, r)Note:1. 第一句将 x,y 数组传递给 plot2.通过第三个参数“b-“指定曲线的颜色和线型,这个参数称为格式化参数,它能够通过一些易记的符号快速指定曲线的样式。其中 b 表示蓝色,“-“表示线型为虚线。3. 用关键字参数指定各种属性: label : 给所绘制的曲线一个名字,此名字在图示/图例(legend)中显示。只要在字符串前后添加“$“符号,matplotlib 就会使用其内嵌的 latex 引擎绘
9、制的数学公式。color : 指定曲线的颜色 linewidth : 指定曲线的宽度具体参见【附录 - matplotlib 中的作图参数】3.设置绘图对象的各个属性plt.xlabel(“years(+2000)“)plt.ylabel(“housing average price(*2000 yuan)“)plt.ylim(0, 15)plt.title(line_regression 0.775x0.8). .Note:getp 函数只能对一个对象进行操作,它有两种用法:指定属性名:返回对象的指定属性的值不指定属性名:打印出对象的所有属性和其值获取当前的绘图对象 plt.gcf()mat
10、plotlib 的整个图表为一个 Figure 对象,此对象在调用 plt.figure 函数时返回,我们也可以通过 plt.gcf 函数获取当前的绘图对象: f = plt.gcf() plt.getp(f)alpha = 1.0animated = False.Figure 对象 axes 属性 plt.gca()Figure 对象有一个 axes 属性,其值为 AxesSubplot 对象的列表,每个 AxesSubplot 对象代表图表中的一个子图,前面所绘制的图表只包含一个子图,当前子图也可以通过 plt.gca 获得 plt.getp(f, “axes“) plt.gca()获取对
11、象的各种属性 plt.getp用 plt.getp 可以发现 AxesSubplot 对象有很多属性,例如它的 lines 属性为此子图所包括的 Line2D 对象列表: alllines = plt.getp(plt.gca(), “lines“) alllines alllines0 = line # 其中的第一条曲线就是最开始绘制的那条曲线True通过这种方法我们可以很容易地查看对象的属性和它们之间的包含关系,找到需要配置的属性。配置文件绘制一幅图需要对许多对象的属性进行配置,例如颜色、字体、线型等等。我们在绘图时,并没有逐一对这些属性进行配置,许多都直接采用了 matplotlib 的
12、缺省配置。matplotlib 将这些缺省配置保存在一个名为“matplotlibrc”的配置文件中,通过修改配置文件,我们可以修改图表的缺省样式。在 matplotlib 中可以使用多个“matplotlibrc”配置文件,它们的搜索顺序如下,顺序靠前的配置文件将会被优先采用。当前路径:程序的当前路径。用户配置路径:通常在用户文件夹的“.matplotlib”目录下,可以通过环境变量 MATPLOTLIBRC 修改它的位置。系统配置路径:保存在 matplotlib 的安装目录下的 mpl-data 中。通过下面的语句可以获取用户配置路径: import matplotlib matplot
13、lib.get_configdir()C:Documents and Settings用户名.matplotlib通过下面的语句可以获得目前使用的配置文件的路径: import matplotlib matplotlib.matplotlib_fname()C:Python26libsite-packagesmatplotlibmpl-datamatplotlibrc由于在当前路径和用户配置路径中都没有找到配置文件,因此最后使用的是系统配置路径下的配置文件。如果读者将 matplotlibrc 复制一份到脚本的当前目录( 例如,c:zhangdoc)下: import os os.getcwd
14、()C:zhangdoc复制配置文件之后再查看配置文件的路径,就会发现它变为了当前目录下的配置文件: matplotlib.matplotlib_fname()C:zhangdocmatplotlibrc如果读者使用文本编辑器打开此配置文件,就会发现它实际上是一个字典。为了对众多的配置进行区分,字典的键根据配置的种类,用“.”分为多段。配置文件的读入可以使用 rc_params(),它返回一个配置字典: matplotlib.rc_params()agg.path.chunksize: 0,axes.axisbelow: False,axes.edgecolor: k,axes.facecol
15、or: w,. .在 matplotlib 模块载入时会调用 rc_params(),并把得到的配置字典保存到 rcParams 变量中: matplotlib.rcParamsagg.path.chunksize: 0,axes.axisbelow: False,. .matplotlib 将使用 rcParams 字典中的配置进行绘图。用户可以直接修改此字典中的配置,所做的改变会反映到此后创建的绘图元素。例如下面的代码所绘制的折线将带有圆形的点标识符: matplotlib.rcParams“lines.marker“ = “o“ plt.plot(1,2,3,2) plt.show()为
16、了方便对配置字典进行设置,可以使用 rc()。下面的例子同时配置点标识符、线宽和颜色: matplotlib.rc(“lines“, marker=“x“, linewidth=2, color=“red“)如果希望恢复到缺省的配置(matplotlib 载入时从配置文件读入的配置),可以调用 rcdefaults()。 matplotlib.rcdefaults()如果手工修改了配置文件,希望重新从配置文件载入最新的配置,可以调用: matplotlib.rcParams.update( matplotlib.rc_params() )通过 pyplot 模块也可以使用 rcParams、r
17、c 和 rcdefaults。皮皮 blog图像载入和显示imread()和 imshow()提供了简单的图像载入和显示功能.plt.imread()从图像文件读入数据,得到一个表示图像的 NumPy 数组。它的第一个参数是文件名或文件对象,format 参数指定图像类型,如果省略,就由文件的扩展名决定图像类型。 对于灰度图像,它返回一个形状为(M,N)的数组;对于彩色图像,返冋形状为(M,N,C) 的数组。 其中,M 为图像的高度,N 为图像的宽度,C 为 3 或 4,表示图像的通道数。程序从“lena.jpg” 中读入图像数据:img = plt.imread(“lena.jpg“) im
18、g.shape (393, 512, 3) img.dtypedtype(uint8)plt.imshowDisplay an image on the axes.matplotlib.pyplot.imshow(X, cmap=None, norm=None, aspect=None, interpolation=None, alpha=None, vmin=None, vmax=None, origin=None, extent=None, shape=None, filternorm=1, filterrad=4.0, imlim=None, ple=None, url=None, ho
19、ld=None, data=None, *kwargs)X : array_like, shape (n, m) or (n, m, 3) or (n, m, 4)vmin, vmax : scalar, optional, default: Nonevmin and vmax are used in conjunction with norm to normalize luminance data. Note if you pass a norm instance, your settings for vmin and vmax will be ignored. plt.imshow(img
20、#注意图像是上下颠倒的#plt.imshow(img:-1) #反转图像数组的第 0 轴,不好理解? plt.imshow(img, origin=”lower”) # 让图表的原点在左下角得到的数组 img 是一个形状为 (393,512,3)的单字节无符号整数数组。这是因为通常使用的图像都是采用单字节分别保存每个像素的红、绿、蓝三个通道的分量。注意,从 JPG 图像中读入的数据是上下颠倒的,为了正常显示图像,可以将数组的第 0 轴反转,或者设置 imshow()的 origin 参数为“lower”, 从而让所显示图表的原点在左下角。如果三维数组的元素类型为浮点数,那么元素的取值范围为 0
21、.0 到 1.0,与颜色值 0 到 255 对应,超出这个范围可能会出现颜色异常的像素。 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()限制取值范围,整个图像变亮如果 imshow()的参数是二维数组,就使用颜色映射表决定每个像素的颜色。下面显示图像 中的红色通道: plt.imshow(img:,:,0)
22、显示效果比较吓人,因为默认的图像映射将最小值映射为蓝色、将最大值映射为红色. 可以使用 colorbar()将颜色映射表在图表中显示出来: plt.colorbar()通过 imshow()的 cmap 参数可以修改显示图像时所采用的颜色映射表。颜色映射表是一个 ColorMap 对象,matplotlib 中已经预先定义好了很多颜色映射表,可通过下面的语句找到这 些颜色映射表的名字: import matplotlib.cm as cm cm._cmapnamesSpectral,copper, RdYlGn, Set2, sumner, spring,gist_ncar,下面使用名为 co
23、pper 的颜色映射表显示图像的红色通道,很有老照片的味道: plt.imshow(img:,:,0,cmap=cm.copper)还可以使用 imshow()显示任意的二维数据,例如下面的程序使用图像直观地显示了二元函数:import numpy as npimport matplotlib.pyplot as pltimport matplotlib.cm as cmy, x = np.ogrid-2:2:200j, -2:2:200jz = x * np.exp( - x*2 - y*2)extent = np.min(x), np.max(x), np.min(y), np.max(y
24、)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()imshow()的 extent 参数,图表的 X、Y 轴的刻度标签所指定的范围.matplotlib.pyplot.imshow皮皮 blogmatplotlib 绘图实例matplotlib 绘图进
25、阶from:http:/ matplotlib.pyplotpython matplotlib 中所有模块查询: Python Module Indexmatplotlib 所有类和类中的函数查询:Index绘图命令集合 : Plotting commands summaryGallerys : http:/matplotlib.org/1.4.3/gallery.htmlMatplotlib 教程(点击对应的图可见源码,复制可直接使用): Matplotlib tutorial关于各个部件和属性:Figures, Subplots, Axes and Ticks用 Python 做科学计算 -基础篇使用 pyplot 模块绘图matplotlib 的一些常用命令和技巧Matplotlib for Python DevelopersMatplotlib Tutorial(译)