问题 Matplotlib OverflowError:分配了太多块


我正在策划三组约20个时间序列。每个时间序列有180万点,我正在分别绘制它们。为了减少执行时间(因为我发现figure()函数非常耗时),我只打开一个数字,绘图然后清理下一个时间序列。就像是:

import matplotlib.pyplot as plt

fig = plt.figure() # open a figure for plotting
for v in range(nfigs):
    # here I build the x and y vectors from the raw data
    # and also the figname string
    plt.plot(x, y, linewidth=0.3)
    plt.title('a title')
    plt.xlabel('x-label')
    plt.ylabel('y-label')
    plt.grid()
    plt.draw()
    plt.savefig(figname)
    plt.clf()
plt.close() # close the figure after the job is done

除了特别是在所有数据集中的所有数据集之外,所有图都保存正常,这给出了以下错误(编辑文件路径以保护隐私):

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "~\AppData\Local\Continuum\Anaconda\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 540, in runfile
    execfile(filename, namespace)
  File "batch.py", line 142, in <module>
    main(fn)
  File "batch.py", line 94, in main
    plt.savefig(figname+'_'+nn+'.png')
  File "~\AppData\Local\Continuum\Anaconda\lib\site-packages\matplotlib\pyplot.py", line 561, in savefig
    return fig.savefig(*args, **kwargs)
  File "~\AppData\Local\Continuum\Anaconda\lib\site-packages\matplotlib\figure.py", line 1421, in savefig
    self.canvas.print_figure(*args, **kwargs)
  File "~\AppData\Local\Continuum\Anaconda\lib\site-packages\matplotlib\backends\backend_qt4agg.py", line 167, in print_figure
    FigureCanvasAgg.print_figure(self, *args, **kwargs)
  File "~\AppData\Local\Continuum\Anaconda\lib\site-packages\matplotlib\backend_bases.py", line 2220, in print_figure
    **kwargs)
  File "~\AppData\Local\Continuum\Anaconda\lib\site-packages\matplotlib\backends\backend_agg.py", line 505, in print_png
    FigureCanvasAgg.draw(self)
  File "~\AppData\Local\Continuum\Anaconda\lib\site-packages\matplotlib\backends\backend_agg.py", line 451, in draw
    self.figure.draw(self.renderer)
  File "~\AppData\Local\Continuum\Anaconda\lib\site-packages\matplotlib\artist.py", line 55, in draw_wrapper
    draw(artist, renderer, *args, **kwargs)
  File "~\AppData\Local\Continuum\Anaconda\lib\site-packages\matplotlib\figure.py", line 1034, in draw
    func(*args)
  File "~\AppData\Local\Continuum\Anaconda\lib\site-packages\matplotlib\artist.py", line 55, in draw_wrapper
    draw(artist, renderer, *args, **kwargs)
  File "~\AppData\Local\Continuum\Anaconda\lib\site-packages\matplotlib\axes.py", line 2086, in draw
    a.draw(renderer)
  File "~\AppData\Local\Continuum\Anaconda\lib\site-packages\matplotlib\artist.py", line 55, in draw_wrapper
    draw(artist, renderer, *args, **kwargs)
  File "~\AppData\Local\Continuum\Anaconda\lib\site-packages\matplotlib\lines.py", line 562, in draw
    drawFunc(renderer, gc, tpath, affine.frozen())
  File "~\AppData\Local\Continuum\Anaconda\lib\site-packages\matplotlib\lines.py", line 938, in _draw_lines
    self._lineFunc(renderer, gc, path, trans)
  File "~\AppData\Local\Continuum\Anaconda\lib\site-packages\matplotlib\lines.py", line 978, in _draw_solid
    renderer.draw_path(gc, path, trans)
  File "~\AppData\Local\Continuum\Anaconda\lib\site-packages\matplotlib\backends\backend_agg.py", line 145, in draw_path
    self._renderer.draw_path(gc, path, transform, rgbFace)
OverflowError: Allocated too many blocks

触发此错误的时间序列对它没有什么特别之处,我用简单的show()而不是savefig()检查了它。它既不是第一个也不是最后一个(大约60个时间序列)但它足以打破我的剧本。对此的帮助非常感谢!


2372
2017-12-02 14:19


起源

绘制一百万点是毫无意义的。您应该在绘图之前对数据进行采样/平滑/平均! - David Zwicker
这个想法恰恰是对整个原始数据集进行可视化筛选,以便做出有关最佳预处理选项的决策。这就是为什么我的问题集中在单个时间序列上的matplotlib错误(来自大约六十个数组)。 - pxc
尽量不要用线条连接点,而只是绘制标记。 plot(x, y, '.') - tacaswell
谢谢@tcaswell,这解决了我的问题(我使用' - '代替情节风格)虽然它没有解决matplotlib问题。根据你的回复,我现在觉得matplotlib无法制作“密集”的线图,这意味着在y轴上从-0.05到0.05的180万个点会在某处溢出...... - pxc
90%肯定它只会在您的情况下偶然修复它。 - tacaswell


答案:


您可以尝试更改值 agg.path.chunksize (10000-100000)中 matplotlibrc 文件或在运行期间 matplotlib.rcParams。它使渲染器一次性绘制块中的路径而不是整个路径;但根据文档,它可能会导致文物。看样品 matplotlibrc 归档于 http://matplotlib.org/1.3.1/users/customizing.html 了解更多信息。


8
2018-04-29 09:44



我按照这些说明操作,但仍然遇到同样的错误。这个问题还有其他潜在的解决方案吗? - kilojoules
鉴于我们在这里谈论巨大的情节,这不会比错误出现时的延迟更多...... - William


什么时候matplotlib.pyplot.rcParams['agg.path.chunksize'] = 20000,我的问题解决了。 png数字很好。


3
2017-10-26 02:55