2013-08-23 4 views
1

Я пытаюсь сохранить фигуру в pyplot с плотными полями.savefig PGF - RuntimeError: не удается получить размер окна без визуализации

Следующий код работает отлично с выходом PDF:

from matplotlib import pyplot as plt 
plt.plot(1) 
plt.savefig('test.pdf', bbox_inches='tight') 

Но не с выходом П

plt.savefig('test.pgf', bbox_inches='tight') 

, как она возвращается RuntimeError: Cannot get window extent w/o renderer.

Почему это происходит, и есть ли способ обойти его?

Matplotlib 1.3.0rc2 на Ubuntu 13.04

python -c "from matplotlib import pyplot as plt; plt.plot(1); plt.savefig('test.pgf', bbox_inches='tight');" 
Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
    File "PYTHONPATH/matplotlib-1.3.0rc2-py2.7-linux-x86_64.egg/matplotlib/pyplot.py", line 561, in savefig 
    return fig.savefig(*args, **kwargs) 
    File "PYTHONPATH/matplotlib-1.3.0rc2-py2.7-linux-x86_64.egg/matplotlib/figure.py", line 1410, in savefig 
    self.canvas.print_figure(*args, **kwargs) 
    File "PYTHONPATH/matplotlib-1.3.0rc2-py2.7-linux-x86_64.egg/matplotlib/backends/backend_qt4agg.py", line 161, in print_figure 
    FigureCanvasAgg.print_figure(self, *args, **kwargs) 
    File "PYTHONPATH/matplotlib-1.3.0rc2-py2.7-linux-x86_64.egg/matplotlib/backend_bases.py", line 2169, in print_figure 
    bbox_inches = self.figure.get_tightbbox(renderer) 
    File "PYTHONPATH/matplotlib-1.3.0rc2-py2.7-linux-x86_64.egg/matplotlib/figure.py", line 1551, in get_tightbbox 
    bb.append(ax.get_tightbbox(renderer)) 
    File "PYTHONPATH/matplotlib-1.3.0rc2-py2.7-linux-x86_64.egg/matplotlib/axes.py", line 9153, in get_tightbbox 
    bb_xaxis = self.xaxis.get_tightbbox(renderer) 
    File "PYTHONPATH/matplotlib-1.3.0rc2-py2.7-linux-x86_64.egg/matplotlib/axis.py", line 1055, in get_tightbbox 
    renderer) 
    File "PYTHONPATH/matplotlib-1.3.0rc2-py2.7-linux-x86_64.egg/matplotlib/axis.py", line 1038, in _get_tick_bboxes 
    extent = tick.label1.get_window_extent(renderer) 
    File "PYTHONPATH/matplotlib-1.3.0rc2-py2.7-linux-x86_64.egg/matplotlib/text.py", line 751, in get_window_extent 
    raise RuntimeError('Cannot get window extent w/o renderer') 
RuntimeError: Cannot get window extent w/o renderer 
+1

Это также происходит с окончательным выпуском? Если да, сообщите об этом как об ошибке. – tacaswell

+0

О, я не понимал, что это не так. Да, это происходит и с финалом 1.3.0. Я сообщу об этом сейчас. – gozzilli

+0

https://github.com/matplotlib/matplotlib/issues/2342 – gozzilli

ответ

1

Кстати, есть обходной путь. Обычно размер изображений PGF/TikZ настраивается автоматически, чтобы он соответствовал чертежу. Для сохранения размера фигуры намерению Matplotlib, эти строки добавляются к выходу:

\pgfpathrectangle{\pgfpointorigin}{\pgfqpoint{8.000000in}{6.000000in}}% 
\pgfusepath{use as bounding box}% 

Если удалить эти строки на самом верху с выходом П вы должны избавиться от какого-либо дополнительного пространства вокруг фигуры.

Использование plt.tight_layout(), или лучше plt.figure(tight_layout=True) в версии 1.3, это еще один способ сделать это (отлично работает с PGF и PGF-> PDF), хотя он немного отличается. Он пересчитывает макет фигуры так, чтобы он соответствовал заданному размеру фигуры. Обычно я предпочитаю этот метод, потому что он также устраняет проблемы, такие как перекрывающиеся текстовые элементы.

+0

Я попытался добавить '' '' plt.figure (tight_layout = True) '' 'к моему коду, но он ничего не сделал бы - где именно я должен его добавить? прямо перед savefig()? – TheChymera

+1

'plt.figure' создает новую фигуру, которую matplotlib неявно делает, когда вы начинаете строить рисунок без создания фигуры. Вы должны поставить этот вызов, прежде чем добавлять какие-либо сюжеты к рисунку. 'plt.tight_layout()' с другой стороны лучше всего размещать прямо перед 'savefig' – pwuertz

+0

Кажется, ничего не делает - все, что я получаю, это http://oi41.tinypic.com/2nixulx.jpg (doesn ' t кажется очень плотным) – TheChymera

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

  • Нет связанных вопросов^_^