在最开始接触python科学计算的时候,就知道了Matplotlib这个绘图库。个人是比较喜欢这种可视化的工具,照我看,GUI这种理念几乎是划时代的。如果说numpy是用来处理数据,那么Matplotlib就是用来展示数据的,抽象的数据,以图表的形式展示出来,无论是对自己,还是对看到的人,接受起来都比较轻松,也跟更容易发现数据内部隐藏着的某些规律性。
Matplotlib似乎是模仿的Matlab,Matlab没有接触过,但是Matplotlib是真的很好用,画出来的图都很优雅,可调整的参数也很多,并且刚开始学也不复杂,官网的帮助文档讲的也都很详细,深入的话当然还是有很多东西的。平常最常用的是pyplot模块,入手并不难,下面简单纪录下,顺便多说句,Matplotlib与numpy高度集成,转换的时候毫无滞碍。
文章参见这里:http://matplotlib.org/api/pyplot_api.html
Example1:
# -*- coding:utf-8 -*- # 导入相关模块 import numpy as np import matplotlib.pyplot as plt x = np.arange(0, 5, 0.1) # 生成一个numpy数组对象 y = np.sin(x) plt.plot(x, y) # 先是x坐标,后是y坐标 plt.show() # 没有这句就画不出图 |
这是最简单的,plot里的参数都是默认的。效果如下:
看起来是曲线,其实都是直线,只是因为点与点之间的距离很小,看起来比较平滑,plot默认会将点连接成线
Example2:
plt.plot([1, 2, 3, 4]) # 增加一个y轴的标签,pyplot模块本身提供了方法 plt.ylabel('some numbers') plt.show() |
这个地方,plot()只提供了一个参数,matplotlib默认是y的,那x的怎么办,matplotlib很聪明,它会自动生成一个,规律就是:从0开始,长度与y相同,效果就就是上图,可以发现,给坐标轴增加标签很简单
Example3:
plt.plot([1, 2, 3, 4], [1, 4, 9, 16], 'ro') # 多了个参数,自定义显示效果 # 增加图名、x和y轴的名字 plt.title('Dot') plt.xlabel('x') plt.ylabel('y') # axis方法定义x轴和y轴的属性 plt.axis([0, 6, 0, 20]) plt.show() |
Plot默认是蓝色实线,这里在plot里增加一个参数'ro',显示就变成红色圆点了,更多的效果参照下图。
Axis方法改变了坐标的属性,参数为[xmin, xmax, ymin, ymax]
Example4:
t = np.arange(0, 5, 0.2) # plot可以同时接收多个参数 plt.plot(t, t, 'r--', t, t ** 2, 'bs', t, t ** 3, 'g^') plt.show() |
从这个例子中可以看到pyplot的灵活性,效果很多样,都可以自定义,还可以同时接受多个参数绘制在一张图表里
Example5:
x = np.arange(0, 5, 0.1) # plot可以接受更多的参数 plt.plot(x, x, linewidth='2.0', color='green') plt.show() |
Matplotlib里有专门的Line2D对象,属性很多,远不止这两个,还得继续学习呢
http://matplotlib.org/api/lines_api.html#matplotlib.lines.Line2D
Example6:
# 定义一个函数 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.subplot(211) plt.plot(t1, f(t1), 'bo') plt.subplot(212) plt.plot(t2, f(t2), 'r-') plt.show() |
分块显示,应用起来很实际。Subplot里的三位数字,第一个表示行数,第二个表示列数,第三个表示编号。数字相同的话,后面的图像会把前面的覆盖
Example7:
mu, sigma = 100, 15 x = mu + sigma * np.random.randn(10000) # hist绘制直方图 n, bins, patches = plt.hist(x, 50, normed=1, alpha=0.75) # text也是个有着复杂属性的对象 # matplotlib还可以自动转换成数学表达式 plt.text(60, 0.025, r'$mu=100, sigma=15$', fontsize='20') plt.axis([40, 160, 0, 0.03]) plt.grid(True) plt.show() |
这个例子就复杂很多,其中有两点,一个是hist,另一个是text对象
可参照以下网址:http://matplotlib.org/users/mathtext.html#mathtext-tutorial
Example8:
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() |
想画出这样的图自然没那么简单,参照:http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.annotate
总结:以上所说,都是比较常用的,参数也相对简单,从这些例子中也能看到,看似简单的东西,背后往往复杂,要学的东西依然还有很多,加油吧。