Skip to main content
 首页 » 编程设计

python之使 pyplot 比 gnuplot 更快

2025年05月04日21del

我最近决定尝试一下 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()