jan*_*ver 1 python gnuplot matplotlib
我最近决定尝试使用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()
Run Code Online (Sandbox Code Playgroud)
我该怎么做才能让数据读取更快?我快速浏览了一下这个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()
Run Code Online (Sandbox Code Playgroud)