如何避免Python绘图中的内存不足?

时间:2016-05-20 12:44:32

标签: python matplotlib

我需要绘制一大堆不同的对象(~10 ^ 5个填充椭圆和类似的形状)。我所做的是使用命令plt.gcf()。gca()。add_artist(e)一次添加一个,然后在末尾使用plt.show()。这需要比我的内存更多的内存。

有没有办法一次一个地绘制它们(也就是说,不像我上面那样添加它们),从而减少了我消耗的内存量?即使使用能够显着增加绘图所需时间的解决方案,我也会没事的。

1 个答案:

答案 0 :(得分:1)

要绘制大量类似的对象,你必须使用其中一个不同的matplotlib.collections类 - 唉,它们的用法有点神秘,至少在我理解的时候是这样......

无论如何,从docsthis official example开始 我能够将以下代码放在一起

$ cat ellipses.py
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.collections import EllipseCollection

N = 10**5

# centres of ellipses —  uniform distribution, -5<=x<5, -3<=y<3
xy = np.random.random((N,2))*np.array((5*2,3*2))-np.array((5,3))

# width, height of ellipses
w, h = np.random.random(N)/10, np.random.random(N)/10

# rotation angles, anticlockwise
a = np.random.random(N)*180-90

# we need an axes object for the correct scaling of the ellipses
fig, ax = plt.subplots()

# create the collection
ec = EllipseCollection(w, h, a,
                    units='x',
                    offsets=xy,
                    transOffset=ax.transData)

ax.add_collection(ec)
ax.autoscale(tight=True)

plt.savefig('el10^5.png')

我把它计时在我几乎低端的笔记本上

$ time python -c 'import numpy; import matplotlib.pyplot as p; f, a = p.subplots()'

real    0m0.697s
user    0m0.620s
sys     0m0.072s
$ time python ellipses.py 

real    0m5.704s
user    0m5.616s
sys     0m0.080s
$

正如您所看到的,当您对每个情节所需的分段进行折扣时,它需要大约 5秒 - 结果是什么?

el10^5.png

我认为关于偏心和角度的细节在如此密集的表现中会丢失,但我不知道你的任务的具体细节,也不会进一步评论。