基本概念
matplotlib
被划分为不同的层次:
matplotlib.pyplot
模块:位于matplotlib
的顶层,它是一个state-machine environment
。该模块中的很多函数是用于给当前Figure
的当前Axes
添加plot element
,比如line
、text
、image
等。它非常类似于Matlab
的用法。- 下一层是面向对象的接口:在这一层
pyplot
只是用部分函数来创建Figure
,然后通过该Figure
显式的创建Axes
,然后通过面向对象的接口在该Axes
上添加图形。极端情况下用户可以完全抛弃pyplot
而完全使用面向对象的接口。
对于非交互式绘图,官方文档推荐用 pyplot
创建 Figure
,然后使用面向对象接口来绘图。
1. 输入数据
matplotlib
的所有 plotting function
期待输入 numpy.array
或者 numpy.ma.masked_array
类型的数据作为输入。某些长得像 numpy.array
的数据比如 numpy.matrix
类型的输入数据可能会导致 matplotlib
工作异常。如果确实需要使用 numpy.matrix
,你应该首先将它转换为 numpy.array
2. matplotlib 、 pyplot 、 pylab 的关系
matplotlib
:它是整个package
matplotlib.pyplot
:是matplotlib
的一个module
。它为底层的面向对象接口提供了一个state-machine interface
。这个state-machine
必要的时候隐式创建Figure
和Axes
,并维护current Figure
和current Axes
pylab
是一个便利的module
,它导入了matplotlib.pyplot
以及numpy
,它只是为了plot
以及math
方便而用。官方文档不推荐使用它。
3. 代码风格
官方文档不推荐 MATLAB
风格的代码。因为 MATLAB
风格代码维护了全局状态,你执行同一个 plot
多次可能会发现结果是不同的。 官方文档推荐使用如下风格:
import matplotlib.pyplot as plt
import numpy as np
fig=plt.figure()
ax=fig.add_subplot(111)
ax.plot(...)
ax.show()
这样的风格使得在绘图事件中,每个角色都很清楚,数据的流动也很清楚。
4. backend
matplotlib
可以适用于非常广泛的场景:
matplotlib
可以交互式地用于python shell
matplotlib
可以嵌入到wxpython
或者pygtk
等GUI
程序中matplotlib
可以在脚本中使用从而生成postscript image
为了适应于这些场景, matplotlib
针对这些 target
生成不同的输出格式。这种能力称之为 backend
。
与之相对的 frontend
指的是用户使用 matplotlib
而编写的代码
有两种类型的 backend
:
- 交互式的
backend
:应用于pygtk
、wxpython
、tkinter
、qt4
、macosx
等中 - 非交互式的
backend
:用于生成image file
(如PNG、SVG、PDF、PS
等格式文件,这些backend
的名字暗示了要存储的文件的格式)
有多种方法来设置 backend
,其中后面提到的方法会覆盖前面的方法设置的 backend
- 在
matplotlibrc
配置文件中设置的backend
参数,如backend: WXAgg #使 use wxpython with antigrain(agg) rendering
- 设置
MPLBACKEND
环境变量,无论是在shell
中设置还是在脚本中设置。 - 对单个脚本设置
backend
时,可以直接在python
命令后添加-d
命令(这种方法不推荐,deprecated
) - 在脚本中使用特定的
backend
时,可以用matplotlib.use('PDF')
命令。这条语句必须在import matplotlib.pyplot
语句之前执行。如果在import matplotlib.pyplot
之后执行use
语句,则没有任何效果。通常建议避免使用use()
方法,因为使用该脚本的人无法修改backend
了。
设定
backend
时,是忽略大小写的。因此GTKAgg
也等价于gtkagg
查看当前的
backend
可以用:matplotlib.get_backend()
a. rendering engine
matplotlib
提供的常用的 rendering engine
是 Agg
,它采用的是 Anti-Grain Geometry C++ library
。除了 macosx
之外的所有 user interface
都可以用 agg rendering
,如 WXAgg,GTKAgg,QT4Agg,TkAgg
这些 backend
。 某些 user interface
还支持其他引擎,如 GTK
支持 Cario
引擎,如 GTKCariro backend
。
下面是所有的 Rendering engine
:
AGG
:输出png
格式文件。它可以输出高质量的图形PS
:输出ps\eps
格式文件。它是Postscript output
PDF
:输出pdf
格式文件。SVG
:输出svg
格式文件Cairo
:可以输出png、ps、pdf、svg...
等格式文件GDK
:可以输出png、jpg、tiff...
等格式文件,它使用Gimp Drawing Kit
要想保存成指定类型文件,如
backend
,
5. 交互式模式
使用交互式 backend
可以 plotting to the screen
,但是前提是 matplotlib
必须是 interactive mode
。
你可以在 matplotlibrc
配置文件中设置 matplotlib
是否位于交互模式,也可以通过代码 matplotlib.interacite()
来设置 matplotlib
位于交互模式。你可以通过代码 matplotlib.is_interactive()
来判断代码是否交互模式。通常并不建议在绘图过程中修改交互模式,因此要提前修改交互模式再绘图。
交互模式也可以通过
matplotlib.pyplot.ion()
开启交互模式,由matplotlib.pyplot.ioff()
关闭交互模式。另外交互模式支持ipython
和python shell
,但是不支持IDLE IDE
。
在交互模式下:
pyplot.plot()
绘图之后图表马上显示,pyplot
自动绘制到屏幕,不需要调用pyplot.show()
- 图表显式之后你可以继续输入命令。任何对图形的修改会实时的反应到图表中去。
- 使用面向对象的方法,如
Axes
的方法并不会自动调用draw_if_interactive()
。如果你通过Axes
来修改图表,想更新图表的话那么你需要手动调用.draw()
方法。而pyplot
模块中的函数会主动调用draw_if_interactive()
,因此如果你是通过pyplot
模块修改图表那么不需要手动调用.draw()
方法就是实时绘制。
在非交互模式下:
- 在绘图之后必须手动调用
pyplot.show()
才能显示图表。该函数会阻塞执行直到你关闭了图表窗口。 - 所有的绘制工作会延迟到
pyplot.show()
函数调用 - 在 1.0 版本以前,单个脚本文件中只能调用一次
pyplot.show()
,在 1.01 版本之后该限制被放松。
6. matplotlib 的颜色
可以通过 matplotlib.pyplot.colors()
方法获取 matplotlib
支持的所有颜色。该方法不做任何事情,就是提供一个帮助文档。
matplotlib
提供了下面颜色的别名: 'b'
:蓝色; 'g'
:绿色; 'r'
:红色; 'y'
:黄色; 'c'
:青色; 'k'
:黑色; 'm'
:洋红色; 'w'
:白色。
你也可以定制自己的颜色。有两种方法:
- 使用 HTML 十六进制字符串:如
'#eeefff'
- 使用 HTML 颜色名字:如
'red'
- 使用一个归一化到闭区间[0-1]的 RGB 元组:如
color=(0.3,0.3,0.4)
在创建 Axes
或者 SubPlot
时,可以给构造函数提供一个 axisbg
参数来指定背景色
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论