使用matplotlib绘图函数绘制图形有时需要几分钟

时间:2014-03-04 14:22:56

标签: python matplotlib

我发现了几个类似于我的问题,但答案在我的情况下不起作用...... 我认为,就我而言,它是不同的东西,我需要一些帮助来弄清楚它是什么。

我的脚本读取两个文件,其中包含50000 x和y值,我使用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()

1 个答案:

答案 0 :(得分:2)

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

要在屏幕上显示图像,matplotlib会将图像压缩到一个800 x 600像素的窗口中。因此,仅以800像素显示50K x值。

换句话说,你正在制作matplotlib,努力绘制很多点,这些点在最终图像中得到了短暂的贬低。

显然,图像应以人类可理解的方式汇总数据。由于我们可能无法围绕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