Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork7.9k
Closed
Milestone
Description
Bug report
Because of the cleanups in#15977, the pgf backend no longer supportsfig.draw(fig.canvas.get_renderer())
to trigger a draw.
If this is not supposed to be a bug and is the correct expected behavior, is there a cleaner way to trigger a draw without usingfig.savefig
?
Bug summary
Code for reproduction
importnumpyasnpimportmatplotlib.pyplotaspltplt.switch_backend('pgf')# Switching to the PGF backendfig,ax=plt.subplots(figsize=(6,3.0),ncols=2,nrows=1,constrained_layout=True,sharey=True)fig.set_constrained_layout_pads(wspace=0.03)ax[0].plot(np.arange(4),'r',label=r'Really longgggg label 1')ax[1].plot(np.arange(5),'b',label=r'Really longgggg label 2')(leg_h0,leg_lab0)=ax[0].get_legend_handles_labels()(leg_h1,leg_lab1)=ax[1].get_legend_handles_labels()# add a legend to one of the axes to make space at the top of the figureleg0=ax[0].legend(leg_h0,leg_lab0,loc='lower center',bbox_to_anchor=(0.5,1.07))leg0.set_in_layout(True)# force to steal space from top of the figure# ------------------------------------------------------# Trigger a draw (required for constrained_layout to work)# fig.canvas.draw() # Doesn't work since pgf is a non-interactive backendfig.draw(fig.canvas.get_renderer())# used to work before #15977# ------------------------------------------------------# Thanks constrained_layout, your work is done! turning you off nowfig.set_constrained_layout(False)# Remove legend from axes and add a figure legend# which includes entries from both axesleg0.remove()fig_leg=fig.legend(*zip(leg_h0,leg_h1),*zip(leg_lab0,leg_lab1),loc='lower center',ncol=2,columnspacing=5,bbox_to_anchor=(0.5,0.85))fig.savefig('test.png',dpi=200)
Actual outcome
Traceback (most recent call last): File "test.py", line 22, in <module> fig.draw(fig.canvas.get_renderer()) # works! File "---\Miniconda3\lib\site-packages\matplotlib\artist.py", line 41, in draw_wrapper return draw(artist, renderer, *args, **kwargs) File "---\Miniconda3\lib\site-packages\matplotlib\figure.py", line 1862, in draw self.patch.draw(renderer) File "---\Miniconda3\lib\site-packages\matplotlib\artist.py", line 41, in draw_wrapper return draw(artist, renderer, *args, **kwargs) File "---\Miniconda3\lib\site-packages\matplotlib\patches.py", line 587, in draw draw_path(tpath, affine, File "---\Miniconda3\lib\site-packages\matplotlib\backends\backend_pgf.py", line 475, in draw_path writeln(self.fh, r"\begin{pgfscope}") File "---\Miniconda3\lib\site-packages\matplotlib\backends\backend_pgf.py", line 129, in writeln fh.write(line)AttributeError: 'NoneType' object has no attribute 'write'
Matplotlib version
- Operating system: Windows 10
- Matplotlib version: 3.3.1
- Matplotlib backend (
print(matplotlib.get_backend())
): pgf - Python version: 3.8.5
- Jupyter version (if applicable):
- Other libraries: