上一篇主要介绍的是用“ReportLab”库来画图和生成报告,并顺便提到了matplotlib。事实上,经过一番探索,我发现:matplotlib+numpy才是目前最流行的python画图模块。这一章,我将结合我之前碰到的几个实际应用,来一窥matplotlib的奇妙。
一、模块简介
matplotlib与numpy一般是组合在一起使用,前者执行画图,后者执行矩阵运算。
1,matplotlib
http://matplotlib.org/
上面是matplotlib的官网,它提供了一个“gallery”,里面有各种用matplotlib画的图,点击图片即可看到源码,非常方便用户找到适合自己需要的模板。此外,它的文档也做的很详细,并提供PDF文件共下载。
如果想快速入门了解,可以看这两篇博客:
http://www.cnblogs.com/wei-li/archive/2012/05/23/2506940.html
http://hyry.dip.jp/tech/book/page/scipy/matplotlib.html
matplotlib事实上,分为快速画图API和面向对象画图。快速画图API由matplotlib.pyplot模块提供支持,它是对各种对象的封装,以使它用起来像matlab。如果碰上比较复杂的画图和大型工程,最好选择“面向对象画图”,而不是matplotlib.pyplot。
2,numpy
http://www.numpy.org/
以上是numpy的官网,它提供了文档链接:https://docs.scipy.org/doc/
从这个链接来看,貌似numpy已经和scipy捆绑了。
如果想要快速了解numpy,可以从这个文档链接跳转:“NumPy User Guide -> Quickstart”;一般性的函数查询,可以进入“NumPy Reference”。
二、实战项目
1,项目介绍
我在学python之前写过一篇博文:《介绍两种通过IQ数据快速画时域功率图的方法》。
“http://blog.csdn.net/sagittarius_warrior/article/details/54963431”
这两种方法分别是matlab和excel。现在,我就用python,严格来说是numpy+matplotlib,来重新实现这个项目。此外,在我的博文《IQ波形文件生成器》中,我生成了一个二进制波形文件,但是并不知道里面的数据是否正确,现在可以将这个二进制波形文件读取出来,画出功率图来查看它是否正确。
http://blog.csdn.net/sagittarius_warrior/article/details/74426542
先看一下实现效果:
对比上面这幅图和之前用matlab画的图,从波形上看是一致,只是线条的粗细不同。
2,代码分析
#PyPlotWave
import struct
from math import sqrt
import numpy as np
import matplotlib.pyplot as plt
filename1 = input('Please enter wave file name:\t') or 'DataOfIQ.txt'
fOut = open('wave.iqbin','wb')
for line in open(filename1, 'rt').readlines():
str1, str2 = line.split(',')
iBytes, qBytes = struct.pack('f',float(str1)), struct.pack('f',float(str2))
fOut.write(iBytes)
fOut.write(qBytes)
fOut.close()
A = np.fromfile("wave.iqbin", dtype=np.float32) # read the data into numpy
x = A[::2]
y = A[1::2]
fig, ax = plt.subplots()
ax.plot(x **2 + y ** 2)
plt.show()
1)8-16行主要将txt文件转为二进制文件。
2)17行读取二进制文件,并返回一个(一维)矩阵。
3)18-19行应用了step技巧,通过list的slice方法,抽取奇偶项组成新的(一维)矩阵。
注:参考https://docs.python.org/2.3/whatsnew/section-slices.html
4)20-22行画图。