2014-03-04 96 views
2

我发现了几个类似于我的问题,但答案在我的情况下不起作用... 我认为,在我的情况下,它是不同的,我需要一些帮助弄清楚它是什么。用matplotlib绘图函数绘制图表需要时间分钟

我的脚本为x和y读取两个50000值的文件,并用matplotlib绘图函数绘制这些值。

我插入了一些打印语句来弄清楚为什么它需要更多的一分钟或有时更长的时间...所以最后的“完成!” (之前的plt.show())之后让我们说2秒,但然后所有东西... ...斯普利特

有时我得到一分钟的图片,然后有时候,同样的事情,需要5分钟,或者我杀了处理。

任何人都可以帮忙吗?我从2012年开始在Mac上工作...

colors = cm.rainbow(np.linspace(0, 1, len(data_dict.keys()))) 

fig, ax = plt.subplots(dpi=150) 
for key,c in zip(data_dict.keys(),colors): 
    ax.plot(x, 
      data_dict[key], 
      label=key, 
      color=c, 
      alpha=.5) 
    print("%s DONE!" % (key)) 

ax.axhline(1,color='red',linestyle='--') 
ax.grid(True) 
ax.set_xlabel("Zeit in ns") 
ax.set_ylabel("Distanz in nm") 
legend = ax.legend() 
print("DONE!") 
plt.show() 
+0

什么' data_dict'看起来像? (你在你的问题中提到过'y',但是你的代码中没有'y')这个'for-loop'调用'ax.plot'的次数是多少?在一台典型的机器上,如果你调用'ax.plot'几千次,你将无法获得良好的性能...... – unutbu

+0

在这种情况下,它被称为2倍... x = [2.0,4.0,6.0 ,. ..]; data_dict = {'filename':[2305.0,3456.0,...], 'filename':[2305.0,3456.0,...]} – drmariod

+0

由于您在plt.show()之前看到最后的'完成'并延迟似乎发生在那里,请尝试fig.savefig('output.jpg')看看需要多长时间来实际创建图像,看看它是否可以在不同的显示方法,如subprocess.Popen( 'firefox','-new-tab','output.jpg')我不得不这样做,因为我需要用非阻塞方法调出图像,以便继续进一步处理。 – sabbahillel

回答

1

典型的显示器显示大约100dpis。你正在绘制50K点。如果每个点并排并列,那么您仍然需要50000/100.0 = 500英寸来单独显示所有点。通常一个图形在点之间会有一点空间,这会使所需英寸的数量更大。

要在屏幕上显示图像,matplotlib正在将图像压缩到可能为800 x 600像素的窗口。因此50K x值仅以800像素显示。

换句话说,你正在使matplotlib努力绘制很多点,在最终的形象中得到短暂的sh points。

显然,图像应该以人类可以理解的方式总结数据。由于我们可能无法将自己的想法包装在50K以内的可区分点上,因此您可能应该缩减采样数据。一种粗暴的方式是采取每第100个点:

x = x[::100] 

或者,你可能需要每100点的平均值:

x = x.reshape(-1, 100).mean(axis=1) 

import matplotlib.pyplot as plt 
import numpy as np 
np.random.seed(1) 
N = 49999 

def chunks(seq, n): 
    # http://stackoverflow.com/a/312464/190597 (Ned Batchelder) 
    """ Yield successive n-sized chunks from seq.""" 
    for i in xrange(0, len(seq), n): 
     yield seq[i:i + n] 

def downsample(seq, n): 
    return [sum(chunk)/len(chunk) for chunk in chunks(seq, n)] 

x = range(N) 
x = downsample(x, 100) 
data_dict = {'A' : np.random.random(N), 'B' : np.random.random(N)} 
colors = plt.cm.rainbow(np.linspace(0, 1, len(data_dict.keys()))) 

fig, ax = plt.subplots(dpi=150) 
for key,c in zip(data_dict.keys(),colors): 
    y = downsample(data_dict[key], 100) 
    ax.plot(x, 
      y, 
      label=key, 
      color=c, 
      alpha=.5) 
    print("%s DONE!" % (key)) 

ax.axhline(1,color='red',linestyle='--') 
ax.grid(True) 
ax.set_xlabel("Zeit in ns") 
ax.set_ylabel("Distanz in nm") 
legend = ax.legend() 
print("DONE!") 
# plt.show() 
plt.savefig('/tmp/test.png') 

enter image description here

+0

'x = x [:: 100]'做了诡计,谢谢!我尝试按照您的建议进行平均,但可以将我的列表保存到此np对象中,您有建议吗?我的x和ys只是带有花车的列表......提前感谢! – drmariod

+0

顺便说一下,你是对的,事实并非如此,我的显示器可以解决这个问题,但这条线在变化很大的区域变得更大胆......我想我需要所有的观点......没有想过,也许5000就足够了,但它看起来还是很棒的...... – drmariod

+0

如果'x'是一个列表,你可以用'x = np.array(x)'将它转换为一个NumPy数组。然后你可以使用'x = x.reshape(-1,100).mean(axis = 1)'来取每100点的平均值。 – unutbu