【问题标题】:"OverflowError: Allocated too many blocks":“溢出错误:分配了太多块”:
【发布时间】:2016-03-29 04:12:15
【问题描述】:

在发布这个问题之前,我检查了所有可能的重复问题并尝试了所有方法,但仍然无法解决问题。

我在 matplotlib 中有一个简单的情节。当我注释掉调用plt.fill_between() 的行时,代码运行良好,但是当我取消注释时,它会抛出溢出错误。

注意:此错误发生在我的 Ubuntu 15.10 笔记本电脑上
但是在 MacOS 中,我尝试了相同的代码,但没有显示错误(令人惊讶!)

更新: 我使用后端作为 TkAgg。

print(mpl.rcParamsDefault)
# Answer is agg.

我的代码如下所示:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# Author  : Bhishan Poudel
# Date    : Mar 28, 2016
# Topic   : OverflowError: Allocated too many blocks
# Note    : python --version ==> Python 2.7.10
# Note    : lsb_release -a   ==> ubuntu 15.10

# Imports
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

# plot values
x = np.arange(0.001, 25.0, 0.01)
A = 4.3
y = np.array( (-1.0/x) + (0.5*A*A/(x**2)) - (A*A/(x**3)) )

# Plots
plt.plot(x,y,color='k')

# Set axes limits
plt.ylim(-0.04,0.06)

# Attempt to resolve OverflowError
plt.rcParams['backend'] = 'TkAgg'  # or, 'qt4agg'
plt.rcParams['agg.path.chunksize'] = 100000
# This did not worked!

# Fill the color
plt.fill_between(x, -0.04, y, color='darkgray', alpha=.5)
# If I comment this line there will be no error!

# Show the plot
plt.show()

我尝试的链接如下:

Matplotlib OverflowError: Allocated too many blocks
pyplot savefig allocating too many blocks
http://matplotlib.org/1.3.1/users/customizing.html

https://github.com/matplotlib/matplotlib/issues/5907
https://github.com/matplotlib/matplotlib/blob/master/matplotlibrc.template

浏览这些链接后,我最初的尝试是这样的:

# Attempt to resolve OverflowError
plt.rcParams['backend'] = 'TkAgg'  # or, 'qt4agg'
plt.rcParams['agg.path.chunksize'] = 100000
# This did not worked!  

尝试 #2:
我创建了一个文件~/.matplotlib/matplotlibrc 然后将以下代码放入其中:

agg.path.chunksize : 10000        # 0 to disable; values in the range
                                  # 10000 to 100000 can improve speed slightly
                                  # and prevent an Agg rendering failure
                                  # when plotting very large data sets,
                                  # especially if they are very gappy.
                                  # It may cause minor artifacts, though.
                                  # A value of 20000 is probably a good
                                  # starting point.

尝试#3:我还安装了模块 seaborn

sudo -H pip install seaborn

并研究了一些文档。
https://stanford.edu/~mwaskom/software/seaborn/tutorial.html
但是,我也找不到解决此问题的方法。

更新:
错误报告如下:

bhishan@poudel:~/OneDrive/Programming/Python/pyprograms/plotting/matplotlib_customization$ /bin/sh /tmp/geany_run_script_R6KUEY.sh
/usr/lib/python2.7/dist-packages/matplotlib/collections.py:571: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison
  if self._edgecolors == str('face'):
Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/matplotlib/backends/backend_qt5.py", line 338, in resizeEvent
    self.draw()
  File "/usr/lib/python2.7/dist-packages/matplotlib/backends/backend_qt5agg.py", line 148, in draw
    FigureCanvasAgg.draw(self)
  File "/usr/lib/python2.7/dist-packages/matplotlib/backends/backend_agg.py", line 469, in draw
    self.figure.draw(self.renderer)
  File "/usr/lib/python2.7/dist-packages/matplotlib/artist.py", line 59, in draw_wrapper
    draw(artist, renderer, *args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/matplotlib/figure.py", line 1079, in draw
    func(*args)
  File "/usr/lib/python2.7/dist-packages/matplotlib/artist.py", line 59, in draw_wrapper
    draw(artist, renderer, *args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/matplotlib/axes/_base.py", line 2092, in draw
    a.draw(renderer)
  File "/usr/lib/python2.7/dist-packages/matplotlib/artist.py", line 59, in draw_wrapper
    draw(artist, renderer, *args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/matplotlib/collections.py", line 751, in draw
    Collection.draw(self, renderer)
  File "/usr/lib/python2.7/dist-packages/matplotlib/artist.py", line 59, in draw_wrapper
    draw(artist, renderer, *args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/matplotlib/collections.py", line 293, in draw
    mpath.Path(offsets), transOffset, tuple(facecolors[0]))
  File "/usr/lib/python2.7/dist-packages/matplotlib/backends/backend_agg.py", line 124, in draw_markers
    return self._renderer.draw_markers(*kl, **kw)
OverflowError: Allocated too many blocks


------------------
(program exited with code: 0)

更新:所需情节如下图:

【问题讨论】:

  • 你能不能也包括你得到的回溯?我无法在当前的 master + python 3 上重现这个
  • matplotlib 使用另一个后端在 macosx 和 linux 中进行绘图,请参阅 github.com/matplotlib/matplotlib/issues/5907。问题似乎是您的数据文件很大,如果您使用fill_between,则可以绘制更多点
  • 试试这个看看你使用的是哪个后端plt.get_backend()
  • 我可以使用 Python 3.4.2、Matplotlib 1.4.2 重现这一点。这里的后端是 TkAgg。为前面的研究竖起大拇指,顺便说一句!一些问题:我可以删除“subplots”行,你需要吗?此外,只需致电 plt.fill_between(x, y) 也对我有用。
  • 我需要在曲线和底线之间填充(y= -0.04,而不是 y=0.0),这会产生错误。

标签: python matplotlib plot error-handling


【解决方案1】:

我无法在我的电脑上重现你的错误,但是如果你想改变matplotlib的后端,最好在导入pyplot之前做。

试试:

import numpy as np
import matplotlib as mpl
mpl.use('TkAgg') # I'd advise testing 'Gtk3Agg' or 'Qt4Agg' (or 5) instead
import matplotlib.pyplot as plt
print(mpl.get_backend()) # check that the change occurred

编辑:好的,我发现了问题,这是因为您的功能几乎是不同的,所以matplotlib 认为它有一个巨大的表面要覆盖...尝试:

plt.fill_between(x, -0.04, np.clip(y,-0.04,0.06))

【讨论】:

  • 感谢您的回答,但这在 Ubuntu 15.10 上不起作用,我尝试了 mpl.use('Qt5Agg') # 我建议改为测试 'Gtk3Agg' 或 'Qt4Agg'(或 5), TkAgg mpl.rcParams['agg.path.chunksize'] = 100000 # 然后剩下的代码。它给出了相同的旧溢出错误。
  • 好的,print 确实证明后端发生了变化?您是否尝试过不使用新后端修改mpl.rcParams['agg.path.chunksize'](只是为了安全起见)?还可以尝试用facecolor 替换color,因为您的错误似乎与边缘有关...
  • 将颜色更改为 facecolor 并且 Agg 后端都不起作用!如果你使用的是 ubuntu,你的 ubuntu 版本和 matplotlib 版本是什么?
  • 好的,我可以在另一台装有 python 2.7 和 matplotlib 4.4.2 的笔记本电脑上重现它;请参阅编辑以获取适用于我的机器的解决方案。明天我会检查与另一台机器的区别。
猜你喜欢
  • 1970-01-01
  • 2012-06-20
  • 2013-12-10
  • 1970-01-01
  • 1970-01-01
  • 2014-02-12
  • 2017-01-21
  • 2015-12-04
  • 2011-08-04
相关资源
最近更新 更多