matplotlib.pyplot
是一个命令风格的函数,他让matplogtlib像MATLAB一样工作.每个pylot函数都对图片做一些改变。例如,创建一个图像,创建一个绘图区域,在绘图区域绘制线条(line),装饰绘图区域的标签,等等。matplotlib.pylot,做了在不指定的情况下,假定你的操作都在当前figure,当前绘图区域。
import matplotlib.pyplot as plt
plt.plot([1,2,3,4])
plt.ylabel('some numbers')
plt.show()#我不确定这段代码是否需要,至少在ipython中不需要
Paste_Image.png
你可能对x轴是0-3,y轴是0-4有点心生疑虑,如果你在
plot()
函数中,只提供一个列表,matplotlib会假定这个列表是y坐标,同时自动为你生成一个从0开始的x坐标,这个x坐标从0开始,同时长度跟你提供的y坐标相同,所以上面的例子中,我们得到的x坐标就是[0,1,2,3].plot()命令非常灵活,它有一个可选的第三个参数,通过一个字符串来描述颜色和线段类型。字符串的描述方式和Matlab类似,它第一个字母表示颜色,后面表示线段类型。默认格式是'b-',他表示蓝色(b)的实线()。下面的例子绘出了红色圆圈('ro')。
import matplotlib.pyplot
plt.plot([1,2,3,4],[1,4,9,16],'ro')
plt.axis([0,6,0,20])
plt.show()
Paste_Image.png
格式字符参数完整解释你参看
plot()
函数的说明。上面示例axis()
函数包含一组列表[xmin,xmax,ymin,ymax],以及设定轴显示方式的参数。如果matplotlib只能处理列表,他对数值处理意义不大,通常你看到的是numpy矩阵。实际上所有的序列在matplotlib内部都是作为numpy arrays处理,下面例子展示了通过不同方式表现numpy arrays。
import numpy as np
import matplotlib.pyplot as plt
t = np.arange(0., 5., 0.2)
plt.plot(t, t, 'r--', t, t**2, 'bs', t, t**3, 'g^')#红色虚线,黑色方块、绿色三角
plt.show()
调整线型的属性
Lines对象的诸多属性可以设置:linewidth(宽),dash style(虚线样式),等等。详见:matplotlib.lines.Line2D
.调用线属性的方法有以下几种。
- 使用键值参数:
plt.plot(x,y,linewidth = 2.0)
- 利用Line2D实例的属性,plt.plot函数会返回一个一个Line2D对象;我们可以用变量来接收这个返回对象,例如
line1,line2 = plot(x1,y1,x2,y2)
。之后我们就可以对对其进行属性设置
line = plt,plot(x,y,'-') #接受对象 line.se_antialiased(False)#关闭反锯齿
- 有点类似于上面的方法,使用
setp()
命令,设置对象的属性,你可以使用字典方式,也可以使用属性,取值方式。看了下面的例子就明白了
lines = plt.plot(x1,y1,x2,y2)
#字典方式设定
plt.setp(lines,color = 'r', linewidth = 2.0)
#属性,值对方式
plt.setp(lines,'color','r','linewidth',2.0)
下面列出了Line2D的属性表.
想获得当前的可设置属性,可以使用setp()函数调用对象。
>>lines = plt.plot([1,2,3])
>>plt.setp(lines)
alpha:float
animated:[True | False]
...snip
处理多个图片和多个轴
MATLAB和pyplot,都有当前画布figure和当前轴axis的概念。所有的绘制命令都是作用在当前axis上的。'gca()'函数返回当前轴axis(当前轴实例)。'gcf()'返回当前图像(当前图像的实例)。通常你需要考虑这些,因为它会随着上下文切换。
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.0, 5.0, 0.1)
t2 = np.arange(0.0, 5.0, 0.02)
plt.figure(1)
plt.subplot(221)
plt.plot(t1, f(t1), 'bo', t2, f(t2), 'k')
plt.subplot(224)
plt.plot(t2, np.cos(2*np.pi*t2), 'r--')
plt.show()
Paste_Image.png
解释下上面的代码:
figure()
命令实际上在这里是可选的,因为默认会创建figure(1),同样,如果你不指定subplot()
,会自动为你创建一个subplot(111).subplot()
命令的三个数字分别表示总行,总列数,图片在行列中的位置。比如上图中,221表示2x2 4个区域中的第一区域,224表示第四个。详见下面的例子:
subplot(221) | subplot(222) |
---|---|
subplot(223) | subplot(224) |
你可以通过figure()
创建多个图像.每个图像里增加多个subplot().下面的例子非常重要,它演示了如何在figure和subplot之间切换。
figure可以理解画布,subplot理解为绘图区域。
plt.figure(1) # 第一个 figure
plt.subplot(211) # 第一个figure中的第一个subplot
plt.plot([1, 2, 3])
plt.subplot(212) # 第一个figure中的第二个subplot
plt.plot([4, 5, 6])
plt.figure(2) # 第二个figure
plt.plot([4, 5, 6]) # 未申明subplot的时候默认为subplot(111)
plt.figure(1) # 切换回第一个figure的最后一个subplot(212)
plt.subplot(211) # 将subplot(211)作为当前subplot
plt.title('Easy as 1, 2, 3') # subplot 211 title
clf()和cla()函数清除当前figure()和当前轴绘制的内容。如果你觉得当前figure、当前axis这些参数被上下文掌控有点恼人,别绝望。这只是因为在生成对象时装饰器的作用(不解),有替代方法可以解决(见:Artis tutorial
)。
添加文本
text()
命令可以用来在任意位置添加文本。xlabel()
,ylabel()
和title()
用于在特定位置添加文本。(详解文本介绍)。
import numpy as np
import matplotlib.pyplot as plt
mu, sigma = 100, 15
x = mu + sigma * np.random.randn(10000)
#the histogram of the data
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, .025, r'$\mu=100,\ \sigma=15$')#图片中显示的mu = 100, sigma = 15
plt.axis([40, 160, 0, 0.03])
plt.grid(True)
plt.show()```
![Paste_Image.png](https://img.haomeiwen.com/i1094799/74f1ba7e305d897b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
`text()`命令会返回一个matplotlib.text.text实例。跟前面提到的线属性一样,你可以用键值方式修改文本的表现形式,或者使用[setp()](http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.setp)函数:
>t = plt.xlabel('my data',fontsize = 14,color = 'red')
#在文本中使用数学符号
matplotlib文本支持TeX形式的数学符号。例如![](https://img.haomeiwen.com/i1094799/cd171995b5b3efac.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)这样败家的符号,如果你知道TexT就知道应该用$符号环绕表达式(不知道)。
>plt.title(r'$\sigma_i=15$')
*r*在这里不可或缺,表示禁止python将‘\'作为退格符号处理。matplotlib内置Tex表达式和layout引擎,详见:[如何书写数学符号和公式](http://matplotlib.org/users/mathtext.html#mathtext-tutorial)。通过这些工具你不需要安装Tex就可以书写公式和表达式。
#注释文本
[`annotate()`](http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.annotate)命令可以为你的图标添加注释信息,注释需要注意两点,1、注释的起始位置xy,和注释文本的起始位置xytext,他们都是(x,y)形式的元组。
import numpy as np
import matplotlib.pyplot as plt
ax = plt.subplot(111)
t = np.arange(0.0, 5.0, 0.01)
s = np.cos(2np.pit)
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()
![](https://img.haomeiwen.com/i1094799/e5d9e1ce1c44c866.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
上面的例子中,箭头的xy起始坐标,文本的起始坐标都是参照图表的坐标轴。实际上我们可以指定不同的坐标轴,详见:[Annotating text](http://matplotlib.org/users/annotations_intro.html#annotations-tutorial)和[Annotating Axis](http://matplotlib.org/users/annotations_guide.html#plotting-guide-annotation)。
#未完待续。。。
网友评论