Skip to content

Commit af74526

Browse files
committed
Fix Text('').get_window_extent(dpi=...).
This special case does not correctly reset the figure dpi, so the figure randomly gets bigger when it's called. This does not affect Text with actual content.
1 parent f8459a5 commit af74526

File tree

2 files changed

+27
-12
lines changed

2 files changed

+27
-12
lines changed

lib/matplotlib/tests/test_text.py

+16
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,22 @@ def test_set_position():
321321
assert a + shift_val == b
322322

323323

324+
@pytest.mark.parametrize('text', ['', 'O'], ids=['empty', 'non-empty'])
325+
def test_non_default_dpi(text):
326+
fig, ax = plt.subplots()
327+
328+
t1 = ax.text(0.5, 0.5, text, ha='left', va='bottom')
329+
fig.canvas.draw()
330+
dpi = fig.dpi
331+
332+
bbox1 = t1.get_window_extent()
333+
bbox2 = t1.get_window_extent(dpi=dpi * 10)
334+
np.testing.assert_allclose(bbox2.get_points(), bbox1.get_points() * 10,
335+
rtol=5e-2)
336+
# Text.get_window_extent should not permanently change dpi.
337+
assert fig.dpi == dpi
338+
339+
324340
def test_get_rotation_string():
325341
assert mpl.text.get_rotation('horizontal') == 0.
326342
assert mpl.text.get_rotation('vertical') == 90.

lib/matplotlib/text.py

+11-12
Original file line numberDiff line numberDiff line change
@@ -891,12 +891,12 @@ def get_window_extent(self, renderer=None, dpi=None):
891891
#return _unit_box
892892
if not self.get_visible():
893893
return Bbox.unit()
894-
if dpi is not None:
895-
dpi_orig = self.figure.dpi
896-
self.figure.dpi = dpi
894+
if dpi is None:
895+
dpi = self.figure.dpi
897896
if self.get_text() == '':
898-
tx, ty = self._get_xy_display()
899-
return Bbox.from_bounds(tx, ty, 0, 0)
897+
with cbook._setattr_cm(self.figure, dpi=dpi):
898+
tx, ty = self._get_xy_display()
899+
return Bbox.from_bounds(tx, ty, 0, 0)
900900

901901
if renderer is not None:
902902
self._renderer = renderer
@@ -905,13 +905,12 @@ def get_window_extent(self, renderer=None, dpi=None):
905905
if self._renderer is None:
906906
raise RuntimeError('Cannot get window extent w/o renderer')
907907

908-
bbox, info, descent = self._get_layout(self._renderer)
909-
x, y = self.get_unitless_position()
910-
x, y = self.get_transform().transform((x, y))
911-
bbox = bbox.translated(x, y)
912-
if dpi is not None:
913-
self.figure.dpi = dpi_orig
914-
return bbox
908+
with cbook._setattr_cm(self.figure, dpi=dpi):
909+
bbox, info, descent = self._get_layout(self._renderer)
910+
x, y = self.get_unitless_position()
911+
x, y = self.get_transform().transform((x, y))
912+
bbox = bbox.translated(x, y)
913+
return bbox
915914

916915
def set_backgroundcolor(self, color):
917916
"""

0 commit comments

Comments
 (0)