2013-12-02 2 views
10

Я планирую три набора из примерно 20 временных рядов. Каждый временной ряд имеет 1,8 миллиона очков, и я планирую их отдельно. Чтобы сократить время выполнения (потому что я обнаружил, что функция figure() довольно трудоемка), я открываю только одну фигуру, график и затем очищаю ее для следующих временных рядов. Что-то вроде:Matplotlib OverflowError: Выделено слишком много блоков

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 временных рядах), но достаточно сломать мой скрипт. Помощь по этому поводу очень ценится!

+1

Нанесение миллиона очков довольно бессмысленно. Вы должны пробовать/сглаживать/усреднять свои данные до построения графика! –

+4

Идея состоит в том, чтобы выполнить визуальный скрининг всего набора необработанных данных, чтобы принимать решения о лучших вариантах предварительной обработки. Вот почему мой вопрос сосредоточен на ошибке matplotlib на одном временном ряду (из массива примерно шестидесяти). – pxc

+6

старайтесь не связывать точки с линиями, вместо этого используйте только маркеры. 'plot (x, y, '.')' – tacaswell

ответ

8

Вы можете попытаться изменить значение agg.path.chunksize (10000-100000) в файле matplotlibrc или во время выполнения в matplotlib.rcParams. Это заставляет визуализатор отображать пути в кусках, а не весь путь одновременно; но согласно документам это может вызвать артефакты. См. Образец matplotlibrc файл на http://matplotlib.org/1.3.1/users/customizing.html для получения дополнительной информации.

+0

Я следил за этими инструкциями, и я все еще получаю ту же ошибку. Есть ли другие возможные решения этой проблемы? – kilojoules

+0

, учитывая, что мы говорим о гигантских сюжетах здесь, это не будет делать больше, чем задержка, когда ошибка будет отображаться ... – William

1

когда комплекты matplotlib.pyplot.rcParams['agg.path.chunksize'] = 20000, моя проблема решена. Показатель png в порядке.

Смежные вопросы