绘图手册
Created Friday 07 December 2012
matplotlib.pyplot是一系列的命令风格的函数,让matplotlib工作起来像MATLAB。每个pyplot函数都对视图窗口起着作用。例如,新建一个视图窗口,在视图窗口中新建一个绘图区域,在其中绘制一些线条,或者用标签装饰绘图等等......matplotlib.pyploti是保持状态的,所以它一直跟踪着当前视图窗口和绘图区域,以及绘图函数可以直接作用到当前坐标轴。
import matplotlib.pyplot as plt
plt.plot([1, 2, 3, 4])
plt.ylabel('some numbers')
plt.show()
你可能会疑惑为什么x轴从0到2,而y轴却是1到3.如果你提供的一个列表或者数组给plot()命令,那么matplotlib假设它是y轴值的序列,并且会自动为你生成x轴值。因为python从0开始,所以默认x轴的值和y轴的值的长度一样但是是从0开始,因此x轴的值是[0, 1, 2]。
plot()是一个万能的命令,可以接收任意数量的参数,例如,绘制x轴对y轴,你可以使用命令:
plt.plot([1,2,3,4], [1,4,9,16])
对于每个x,y参数对,还有可选的第三个参数,它是字符串的格式指示绘图的颜色和线条类型。这些字符和符号的格式从MATLAB借鉴而来,你可以混合使用颜色字符串和线条类型字符串。默认的格式字符串是"b-",就是蓝色实体线条。例如,使用红色圆格式来绘图,你可以使用
import matplotlib.pyplot as plt
plt.plot([1,2,3,4], [1,4,9,16], 'ro')
plt.axis([0, 6, 0, 20])
查看plot()文档了解所有的线型以及格式字符串。在上面例子中axis()命令的参数是[x轴最小值,x轴最大值,y轴最小值,y轴最大值]的列表,它指定了坐标轴的视点。
如果matplotlib只限定使用列表,那么它对于数字处理是绝对没有用处。一般的,你使用numpy的数组。事实上,所有的序列都会内部自动转换成numpy的数组。下面这个例子表明了在一个命令中使用数组绘制用不同的格式的多条线
import numpy as np
import matplotlib.pyplot as plt
t = np.arange(0, 5, 0.2)
plt.plot(t, t, 'r--', t, t2, 'bs', t, t3, 'g^')
3.1 控制线条属性
线条有很多属性你可以设置:线宽(linewidth),破折号样式(dash style),抗锯齿(antialiased)等等。查看matplotlib.lines.Line2D.这里有很多方式去设置线条的属性
· 使用关键字参数:
plt.plot(x, y, linewidth=2.0)
· 使用Line2D的实例的setter方法。
plot返回一个线条列表,如line1, line2 = plot(x1, y1, x2, y2).下面只有一条线条,所以这个线条列表的长度为1。 我使用元组解包(unpacking) line, = plot(x, y, 'o')来获得列表的第一个元素。line, = plt.plot(x, y, '-')
line.set_antialiased(False) # 关闭抗锯齿
· 使用setp()命令
下面这个例子使用MATLAB风格的命令来设置线条列表的多个属性。setp对用户透明,它使用一个包含对象的列表或者一个对象。你既可以使用python的关键字参数,又可以使用MATLAB风格的字符串/值对方式:lines = plt.plot(x1, y1, x2, y2)
# 使用关键字参数
plt.setp(lines, color='r', linewidth=2.0)
# 使用MATLAB风格的字符串/值对
plt.setp(lines, 'color', 'r', 'linewidth', 2.0)
Line2D属性的可选项:
属性 值类型
alpha float
animated [True | False]
antialiased or aa [True | False]
clip_box 一个matplotlib.transform.Bbox实例
clip_on [True | False]
clip_path 一个Path实例和一个Transform实例, a Patch
color or c any matplotlib color
contains the hit testing function
dash_capstyle [‘butt’ | ‘round’ | ‘projecting’]
dash_joinstyle [‘miter’ | ‘round’ | ‘bevel’]
dashes sequence of on/off ink in points
data (np.array xdata, np.array ydata)
figure 一个matplotlib.figure.Figure实例
label 任何字符串
linestyle or ls [ ‘-‘ | ‘–’ | ‘-.’ | ‘:’ | ‘steps’ | ...]
linewidth or lw float value in points
lod [True | False]
marker [ ‘+’ | ‘,’ | ‘.’ | ‘1’ | ‘2’ | ‘3’ | ‘4’
markeredgecolor or mec any matplotlib color
markeredgewidth or mew float value in points
markerfacecolor or mfc any matplotlib color
markersize or ms float
markevery None | integer | (startind, stride)
picker 使用在交互式环境中的线条选择
pickradius 线条的拾取半径
solid_capstyle [‘butt’ | ‘round’ | ‘projecting’]
solid_joinstyle [‘miter’ | ‘round’ | ‘bevel’]
transform 一个matplotlib.transforms.Transform实例
visible [True | False]
xdata np.array
ydata np.array
zorder 任何数字
为了获得可以设置线条属性的列表,可以调用带一个线条或者线条列表的参数的setp()函数
In [69]: lines = plt.plot([1,2,3])
In [70]: plt.setp(lines)
animated: [True | False]
antialiased or aa: [True | False]
...snip
3.2 使用多视图窗口和坐标轴
MATLAB和pyplot,都有当前视图窗口和当前坐标轴的概念。所有的绘图命令都会作用到当前的坐标轴。gca()函数返回当前的坐标轴(一个matplotlib.axes.Axes的实例),gcf()函数返回当前视图窗口(一个matplotlib.figure.Figure实例)。一般来说,你不用为这个担心,因为它会对后面的情形操心的。下面的小程序将会新建两个子视图:
import numpy as np
import matplotlib.pyplot as plt
def f(t):
return np.exp(-t) * np.cos(2*np.pi*t)
t1 = np.arange(0, 5, 0.1)
t2 = np.arange(0, 5, 0.02)
plt.figure(1)
plt.subplot(211)
plt.plot(t1, f(t1), 'bo', t2, f(t2), 'k')
plt.subplot(212)
plt.plot(t2, np.cos(2*np.pi*t2), 'r--')
这里的figure()命令是可选的,因为figure(1)将会默认创建,就像subplot(111)也会默认创建即使你没有手动指定坐标轴。 subplot()命令指定行数,列数,视图数,而视图数从1到行数*列数。如果行数乘以列数小于10时,逗号在subplot命令中是可选的。所以subplot(211)和subplot(2,1,1)是对等的。你可以创建任意数量的子试图(subplots)和坐标轴(axes).如果你想要手动放置坐标轴,如,不在矩形格中,请使用axes()命令,它可以允许你指定位置用axes([左,下,宽,高]),所有的参数都是分数(0到1)。参考pylab_examples-axes_demo,手动放置坐标轴的例子和pylab_examples-line_styles,很多子试图的例子。
你可以用递增的视图窗口数多次调用figure()函数来创建很多视图窗口(figures)。当然,每个视图窗口都可以包含很多的坐标轴和子视图,只要你愿意:
import matplotlib.pyplot as plt
# 第一个视图窗口
plt.figure(1)
# 第一个视图窗口中的第一个子视图
plt.subplot(211)
plt.plot([1,2,3])
# 地一个视图窗口中的第二个子视图
plt.subplot(212)
plt.plot([4,5,6])
# 第二个视图窗口
plt.figure(2)
# 默认创建subplot(111)
plt.plot([4,5,6])
# 切换到第一个视图窗口,并且当前的子视图还是subplot(212)
plt.figure(1)
# 使地一个视图窗口的subplot(211)及第一个子视图为当前子视图
plt.subplot(211)
# 第一个子视图的标题
plt.title('Easy as 1,2,3')
你可以使用clf()来清除当前视图窗口和cla()来清除当前坐标轴。如果你发现保持状态很烦人,不用灰心,这只是一个弱的面向API的对象的状态包装器,你可以使用其它替代的(查看艺术家手册)
如果你创建了很多的视图窗口序列,那么你需要清醒的知道一件事:视图窗口需要的内存并不是完全释放直到你显示的调用close()来关闭。删除所有视图窗口的引用或者使用窗口管理程序来杀死屏幕上的那个视图窗口进程并不是完全的,因为pyplot内部维护着引用直到调用close().
3.3 使用文本
text()命令可以在任何位置添加文本,xlabel()、ylabel()和title()用来在指定的位置上添加文本。(获得更多详细例子请查看文本简介)
import numpy as np
import matplotlib.pyplot as plt
mu, sigma = 100, 15
x = mu + sigma * np.random.randn(10000)
# 数据直方图
n, bins, patches = plt.hist(x, 50, normed=1, facecolor='g', alpha=0.75)
plt.xlabel('Smarts')
plt.ylabel('Probability')
plt.title('Histogram of IQ')
plt.text(60, 0.25, r'$\mu=100, \ \sigma=15$')
plt.axis([40, 160, 0, 0.03])
plt.grid(True)
所用的text()命令都会返回一个matplotlib.text.Text的实例。就好像上面的线条一样,你可以自定义属性通过传递关键字参数到文本函数或者使用setp()
t = plt.xlabel('my data', fontsize=14, color='red')
这些属性的更多详情请查看 文本属性和布局
3.3.1 在文本中使用数学表达式
在任何文本表达式中,matplotlib都接受TeX方程式表达式。例如在标题写表达式σi = 15, 你可以在两个美元符号($)中书写TeX表达式:
plt.title(r'$\sigma_i = 15$')
这里的r对于处理标题文本很重要-它象征了这个字符串是原生的字符串并且不用处理反斜杠(backslashes)以及python的脱字符(escapes).matplotlib已经内置了TeX表达式解析器和布局引擎,而且自带了自己的数学字体-详情见 书写数学表达式。所以你可以跨平台使用数学文本而不用安装TeX。对于那些已经安装了LaTeX和divpng的,你可以使用LaTeX来格式化你的文本和混合输出到你的显示视图窗口上或者保存到postscript-见使用LaTeX渲染文本
3.3.2 注释文本
在坐标轴上的任意位置都可以使用基础命令text()。一个文本的通用情况就是在绘图上注释。annotate()方法就提供了这种帮助函数,使注释变得简单。在一个注释中,需要考虑两点:参数xy代表了注释点在哪里,xytext代表了注释文本在哪里。这两个参数都是(x, y)的元组。
import numpy as np
import matplotlib.pyplot as plt
ax = plt.subplot(111)
t = np.arange(0, 5, 0.01)
s = np.cos(2*np.pi*t)
line, = plt.plot(t, s, lw=2)
plt.annotate('local max', xy=(2,1), xytext=(3,1.5), arrowprops=dict(facecolor='black', shrink=0.05),)
plt.ylim(-2,2)
plt.show()
在这个简单的例子中,xy(箭头)和xytext位置(文本位置)都在数据范围中的坐标。
这里有很多其他坐标系统可选-详情见注释文本和注释坐标轴。更多例子可以在pylab_examples-annotation_demo找到。