我最近决定尝试一下 matplotlib.pyplot,同时多年来一直使用 gnuplot 进行科学数据绘图。我从简单地读取一个数据文件并绘制两列开始,就像 gnuplot 对 plot 'datafile' u 1:2 所做的那样。 我的舒适度要求是:
- 跳过以
#开头的行并跳过空行。 - 允许在实际数字之间和之前有任意数量的空格
- 允许任意数量的列
- 要快
现在,下面的代码是我解决这个问题的方法。然而,与 gnuplot 相比,它确实没有那么快。这有点奇怪,因为我读到 py(plot/thon) 相对于 gnuplot 的一大优势是它的速度。
import numpy as np
import matplotlib.pyplot as plt
import sys
datafile = sys.argv[1]
data = []
for line in open(datafile,'r'):
if line and line[0] != '#':
cols = filter(lambda x: x!='',line.split(' '))
for index,col in enumerate(cols):
if len(data) <= index:
data.append([])
data[index].append(float(col))
plt.plot(data[0],data[1])
plt.show()
我该怎么做才能加快数据读取速度?我快速浏览了 csv 模块,但它似乎对文件中的注释不太灵活,而且仍然需要遍历文件中的所有行。
请您参考如下方法:
既然你已经安装了 matplotlib,你还必须安装 numpy。 numpy.genfromtxt满足您的所有要求,并且应该比在 Python 循环中自己解析文件快得多:
import numpy as np
import matplotlib.pyplot as plt
import textwrap
fname='/tmp/tmp.dat'
with open(fname,'w') as f:
f.write(textwrap.dedent('''\
id col1 col2 col3
2010 1 2 3 4
# Foo
2011 5 6 7 8
# Bar
# Baz
2012 8 7 6 5
'''))
data = np.genfromtxt(fname,
comments='#', # skip comment lines
dtype = None, # guess dtype of each column
names=True) # use first line as column names
print(data)
plt.plot(data['id'],data['col2'])
plt.show()
