8000 Merge pull request #15221 from anntzer/get_renderer · QuLogic/matplotlib@9ccdb1d · GitHub
[go: up one dir, main page]

Skip to content

Commit 9ccdb1d

Browse files
authored
Merge pull request matplotlib#15221 from anntzer/get_renderer
Don't fallback to agg in tight_layout.get_renderer.
2 parents 775e41c + b9cea08 commit 9ccdb1d

File tree

3 files changed

+26
-13
lines changed

3 files changed

+26
-13
lines changed

lib/matplotlib/backend_bases.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1502,7 +1502,7 @@ def __init__(self, name, canvas, key, x=0, y=0, guiEvent=None):
15021502
self.key = key
15031503

15041504

1505-
def _get_renderer(figure, print_method, *, draw_disabled=False):
1505+
def _get_renderer(figure, print_method=None, *, draw_disabled=False):
15061506
"""
15071507
Get the renderer that would be used to save a `~.Figure`, and cache it on
15081508
the figure.
@@ -1521,8 +1521,11 @@ class Done(Exception):
15211521
def _draw(renderer): raise Done(renderer)
15221522

15231523
with cbook._setattr_cm(figure, draw=_draw):
1524+
if print_method is None:
1525+
fmt = figure.canvas.get_default_filetype()
1526+
print_method = getattr(figure.canvas, f"print_{fmt}")
15241527
try:
1525-
print_method(io.BytesIO())
1528+
print_method(io.BytesIO(), dpi=figure.dpi)
15261529
except Done as exc:
15271530
renderer, = figure._cachedRenderer, = exc.args
15281531

@@ -2090,7 +2093,7 @@ def print_figure(
20902093
renderer = _get_renderer(
20912094
self.figure,
20922095
functools.partial(
2093-
print_method, dpi=dpi, orientation=orientation),
2096+
print_method, orientation=orientation),
20942097
draw_disabled=True)
20952098
self.figure.draw(renderer)
20962099
bbox_inches = self.figure.get_tightbbox(

lib/matplotlib/tests/test_tightlayout.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,3 +310,18 @@ def test_suptitle():
310310
t = ax.set_title("bar")
311311
fig.canvas.draw()
312312
assert st.get_window_extent().y0 > t.get_window_extent().y1
313+
314+
315+
@pytest.mark.backend("pdf")
316+
def test_non_agg_renderer(monkeypatch, recwarn):
317+
unpatched_init = mpl.backend_bases.RendererBase.__init__
318+
319+
def __init__(self, *args, **kwargs):
320+
# Check that we don't instantiate any other renderer than a pdf
321+
# renderer to perform pdf tight layout.
322+
assert isinstance(self, mpl.backends.backend_pdf.RendererPdf)
323+
unpatched_init(self, *args, **kwargs)
324+
325+
monkeypatch.setattr(mpl.backend_bases.RendererBase, "__init__", __init__)
326+
fig, ax = plt.subplots()
327+
fig.tight_layout()

lib/matplotlib/tight_layout.py

Lines changed: 5 additions & 10 deletions
< 8000 /tr>
Original file line numberDiff line numberDiff line change
@@ -166,19 +166,14 @@ def auto_adjust_subplotpars(
166166

167167
def get_renderer(fig):
168168
if fig._cachedRenderer:
169-
renderer = fig._cachedRenderer
169+
return fig._cachedRenderer
170170
else:
171171
canvas = fig.canvas
172-
173172
if canvas and hasattr(canvas, "get_renderer"):
174-
renderer = canvas.get_renderer()
175-
else: # Some noninteractive backends have no renderer until draw time.
176-
cbook._warn_external("tight_layout: falling back to Agg renderer")
177-
from matplotlib.backends.backend_agg import FigureCanvasAgg
178-
canvas = FigureCanvasAgg(fig)
179-
renderer = canvas.get_renderer()
180-
181-
return renderer
173+
return canvas.get_renderer()
174+
else:
175+
from . import backend_bases
176+
return backend_bases._get_renderer(fig, draw_disabled=True)
182177

183178

184179
def get_subplotspec_list(axes_list, grid_spec=None):

0 commit comments

Comments
 (0)
0