Savefig PGF - RuntimeError: cannot get window size without rendering

I am trying to save a shape in pyplot with tight margins.

The following code works fine with PDF output:

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

But not with PGF

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

when it returns RuntimeError: Cannot get window extent w/o renderer .

Why is this happening and is there a way around this?

matplotlib 1.3.0rc2 on 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
source share
1 answer

By the way, there is a workaround. Typically, PGF / TikZ images are automatically sized to fit the drawing. To preserve the size of the shape indicated by matplotlib, these lines are added to the output:

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

If you remove these lines at the very top from the PGF output, you must get rid of any extra space around the shape.

Using plt.tight_layout() or better plt.figure(tight_layout=True) in version 1.3 is another way to do this (works fine with PGF and PGF-> PDF), although it is slightly different. It recounts the layout of the shape to fit the given size of the shape. I usually prefer this method because it also fixes issues like overlapping text elements.

+1
source

Source: https://habr.com/ru/post/1201192/


All Articles