Подтвердить что ты не робот

"OverflowError: выделено слишком много блоков":

Прежде чем отправлять этот вопрос, я проверил все возможные повторяющиеся вопросы и пробовал весь метод и все еще не мог решить проблему.

У меня есть простой сюжет в matplotlib. Когда я прокомментирую строку, вызывающую plt.fill_between(), код работает отлично, но когда я раскомментирую, это вызовет ошибку переполнения.

Примечание. Эта ошибка возникает в моем ноутбуке с Ubuntu 15.10
    Однако в MacOS я попробовал тот же код и не обнаружил ошибки (удивительно!)

Update: Я использовал бэкэнд как 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: выделено слишком много блоков
pyplot savefig выделяет слишком много блоков
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
Однако я также не мог найти решение этой проблемы.

Обновление:
Отчет об ошибке следующий:

[email protected]:~/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)

Обновление: Требуемый график показан ниже:
введите описание изображения здесь

4b9b3361

Ответ 1

Я не могу воспроизвести вашу ошибку на своем компьютере, но если вы хотите изменить бэкэнд matplotlib, лучше сделать это перед импортом pyplot.

Try:

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

EDIT: ok, я нашел проблему, потому что ваша функция почти расходится, поэтому matplotlib считает, что она имеет огромную поверхность для покрытия... try:

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