牛刀小试
导入类库:
import matplotlib.pyplot as plt
画图:
plt.plot([1, 2, 3, 4])
如果只提供了一个参数给plot()时,默认是给y的,自动生成x。给图添加修饰
plt.xlabel('x label') # 横坐标
plt.ylabel('y label') # 纵坐标
plt.title('Test') # 标题
-
显示
plt.show()
结果如图1所示
接下来,我们改变一些参数试试:
可以给plot()传入多个参数:
plt.plot([1, 2, 3, 4], [1, 4, 9, 16], 'ro')
第一个列表参数赋值给x
第二个列表参数赋值给y
第三个参数“ro”种r
表示颜色,o
表示形状通过axis()改变坐标轴的度量
plt.axis([0, 6, 0, 20])
列表的前两个数表示x轴的范围,0~6
列表的后两个数表示y轴的范围,0~20同样使用plt.show()显示图像
plt.show()
结果如图2所示
- 但通用的方法还是给plot()传入数组
import numpy as np
array = np.arange(0, 5, 0.1)
plt.plot(array, array**2, 'bs')
结果如图3所示
设置线条属性
一般有以下几个方法设置线条属性
- 使用关键字:
plt.plot(x, y, linewidth=2.0)
- 使用plot返回一个由二维线条对象组成的列表,该对象有一个setter方法
line, = plt.plot(x, y, '-') # 此处返回的列表长度为1
line.set_antialiased(False) # 设置antialising属性为False
- 使用setp()命令,可以使用关键字标注和matlab风格的方式
lines = plt.plot(x1, y1, x2, y2) # 返回线条列表,长度为2
plt.setp(lines, color='r', linewidth=2.0) # 使用keyword
plt.setp(lines, 'color', 'r', 'linewidth', 2.0) # matlab风格
常用的属性
多图和axes
Matplotlib和Matlab一样,都有图和子图的概念,图用figure表示,子图用axes表示
所有使用plt的操作都是针对当前的图或子图进行的
- gca()可以输出当前的axes
- gcf()可以输出当前的figure
- 下面是一个多图多子图的例子:
x = np.arange(0, 5, 0.1)
plt.figure(1) # 创建了图1(figure(1))
plt.subplot(211) # 在figure1种生成子图1
plt.plot(x, np.sin(x)) # 在当前子图,也就是子图1种画图
plt.subplot(212) # 在figure1中生成子图2
plt.plot(x, x**2)
plt.figure(2)
plt.subplot(131)
plt.plot(x, x)
plt.subplot(132)
plt.plot(x, 2*x+1)
plt.subplot(133)
plt.plot(x, np.cos(x))
plt.show()
其中:
- 在创建子图时使用了
plt.subplot(211)
,其中的211
可以这样解释:前两位数可以理解为2*1
,也就是在figure1中生成两个子图,最后一位1
解释为子图编号,也就是figure1中的第一个子图 -
211
也可理解为图的布局为两行一列的第一个图,132
就理解为一行三列的第二副图
上面程序的运行结果:
-
上面的创建图和子图的方法有些麻烦,有一种更为简单的方法:
使用plt.subplots
创建新的figure,返回值为已创建subplot对象的Numpy数组:
>>>fig, axes = plt.subplots(2, 3)
>>>axes
[[<matplotlib.axes._subplots.AxesSubplot object at 0x0000022940B0D940>
<matplotlib.axes._subplots.AxesSubplot object at 0x0000022940CAC550>
<matplotlib.axes._subplots.AxesSubplot object at 0x0000022940CE5240>]
[<matplotlib.axes._subplots.AxesSubplot object at 0x0000022940D77748>
<matplotlib.axes._subplots.AxesSubplot object at 0x0000022940D88FD0>
<matplotlib.axes._subplots.AxesSubplot object at 0x0000022940E41780>]]
结果如图6,在一个figure中创建了6个子图
figure过度时会导致内存警告
可以使用clg()删除当前figure,cla()删除当前的axes plt针对当前子图进行操作,而axes只关注它本身
使用axes也可以操作子图
fig = plt.figure()
ax = fig.add_subplot(111)
x = np.arange(1, 5, 0.1)
y = x**3
ax.scatter(x, y)
ax.set_xlabel('x label')
ax.set_ylabel('y label')
plt.show()
结果如图7所示
文本工作
- 可以使用text()在任意位置添加文本
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$')
plt.axis([40, 160, 0, 0.03])
plt.grid(True)
plt.show()
结果如图8所示
- 使用
plt.text(60, .025, r'$\mu=100,\ \sigma=15$')
在点(60, 0.025)
处添加了文本u=100, sigma=15
-
plt.grid(True)
表示在图中添加网格
- 使用annotate()
from numpy import pi
t = np.arange(0.0, 5.0, 0.01)
s = np.cos(2*np.pi*t)
line, = plt.plot(t, s, lw=2)
plt.annotate('point(2, 1)', xy=(2, 1), xytext=(3, 1.5),
arrowprops=dict(facecolor='black', shrink=0.05),
)
plt.ylim(-2,2)
lt.show()
运行结果如图9所示
使用
plt.annotate('point(2, 1)', xy=(2, 1), xytext=(3, 1.5),
arrowprops=dict(facecolor='black', shrink=0.05),
)
来进行注释,point(2, 1)', xy=(2, 1)
表示在点(2, 10)
处添加文本"point(2, 1)"
xytext=(3, 1.5),arrowprops=dict(facecolor='black', shrink=0.05)
表示注释文本的位置为(3, 1.5)
处,arrowprops
描述了箭头
使用文本的方法
- 所有的
test()
方法都会返回一个matplotlib.text.Text
实例,可以使用关键字参数和setp()的形式使用文本。
t = plt.xlabel('my data', fontsize=14, color='red')
- matplotib可以使用TeX表达式描述任何文本,比如文本
plt.title(r'$\sigma_i=15$')
这里有一些常用的数学式表述方式
http://matplotlib.org/users/mathtext.html#mathtext-tutorial
保存到文件
使用plt.savefig()将当前图保存到文件
例如:将figure保存为svg文件,plt.savefig('figpath.svg')
总结一些自己学习的知识点,谢谢!