From 627f16bea16957f990ce89ae7b9c4b42eb14c670 Mon Sep 17 00:00:00 2001 From: NNiehof Date: Sun, 29 Oct 2017 23:29:26 +0100 Subject: [PATCH 1/7] fetch rcParams in fig.clf() Optionally fetch rcParams again in clf, issue #7434 --- lib/matplotlib/figure.py | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/figure.py b/lib/matplotlib/figure.py index eb13d2e5f6dd..a415a2e685ee 100644 --- a/lib/matplotlib/figure.py +++ b/lib/matplotlib/figure.py @@ -336,6 +336,7 @@ def __init__(self, raise ValueError('figure size must be finite not ' '{}'.format(figsize)) self.bbox_inches = Bbox.from_bounds(0, 0, *figsize) + self.figsize = figsize self.dpi_scale_trans = Affine2D().scale(dpi, dpi) # do not use property as it will trigger @@ -351,6 +352,8 @@ def __init__(self, facecolor=facecolor, edgecolor=edgecolor, linewidth=linewidth) self._set_artist_props(self.patch) self.patch.set_aa(False) + self.facecolor = facecolor + self.edgecolor = edgecolor self._hold = rcParams['axes.hold'] if self._hold is None: @@ -364,6 +367,7 @@ def __init__(self, self.subplotpars = subplotpars self.set_tight_layout(tight_layout) + self.tight_layout = tight_layout self._axstack = AxesStack() # track all figure axes and current axes self.clf() @@ -1226,12 +1230,14 @@ def _break_share_link(ax, grouper): if last_ax is not None: _reset_loc_form(last_ax.xaxis) - def clf(self, keep_observers=False): + def clf(self, keep_observers=False, disable_rc_fetch=True): """ Clear the figure. Set *keep_observers* to True if, for example, a gui widget is tracking the axes in the figure. + Set *disable_rc_fetch* to False to reset figure + parameters to rcParams values. """ self.suppressComposite = None self.callbacks = cbook.CallbackRegistry() @@ -1252,10 +1258,21 @@ def clf(self, keep_observers=False): self.legends = [] if not keep_observers: self._axobservers = [] + if not disable_rc_fetch: + if self.figsize is None: + self.figsize = rcParams['figure.figsize'] + if self.facecolor is None: + self.facecolor = rcParams['figure.facecolor'] + if self.edgecolor is None: + self.edgecolor = rcParams['figure.edgecolor'] + if self.frameon is None: + self.frameon = rcParams['figure.frameon'] + self.subplotpars.update() + self.set_tight_layout(self.tight_layout) self._suptitle = None self.stale = True - def clear(self, keep_observers=False): + def clear(self, keep_observers=False, disable_rc_fetch=True): """ Clear the figure -- synonym for :meth:`clf`. """ From b2894e15e79147dd821cf44613c0157aa2c20762 Mon Sep 17 00:00:00 2001 From: NNiehof Date: Mon, 30 Oct 2017 00:12:56 +0100 Subject: [PATCH 2/7] Changed inverted kwarg disable_rc_fetch to reset_rcparams --- lib/matplotlib/figure.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/matplotlib/figure.py b/lib/matplotlib/figure.py index a415a2e685ee..fc1a4bd432cb 100644 --- a/lib/matplotlib/figure.py +++ b/lib/matplotlib/figure.py @@ -1230,13 +1230,13 @@ def _break_share_link(ax, grouper): if last_ax is not None: _reset_loc_form(last_ax.xaxis) - def clf(self, keep_observers=False, disable_rc_fetch=True): + def clf(self, keep_observers=False, reset_rcparams=False): """ Clear the figure. Set *keep_observers* to True if, for example, a gui widget is tracking the axes in the figure. - Set *disable_rc_fetch* to False to reset figure + Set *reset_rcparams* to True to reset figure parameters to rcParams values. """ self.suppressComposite = None @@ -1258,7 +1258,7 @@ def clf(self, keep_observers=False, disable_rc_fetch=True): self.legends = [] if not keep_observers: self._axobservers = [] - if not disable_rc_fetch: + if reset_rcparams: if self.figsize is None: self.figsize = rcParams['figure.figsize'] if self.facecolor is None: @@ -1272,11 +1272,11 @@ def clf(self, keep_observers=False, disable_rc_fetch=True): self._suptitle = None self.stale = True - def clear(self, keep_observers=False, disable_rc_fetch=True): + def clear(self, keep_observers=False, reset_rcparams=False): """ Clear the figure -- synonym for :meth:`clf`. """ - self.clf(keep_observers=keep_observers) + self.clf(keep_observers=keep_observers, reset_rcparams=reset_rcparams) @allow_rasterization def draw(self, renderer): From 99d0cc93fdbe335c2978fd0df28d097de63898e6 Mon Sep 17 00:00:00 2001 From: NNiehof Date: Sun, 12 Nov 2017 22:49:15 +0100 Subject: [PATCH 3/7] added test and whats_new entry --- .../2017-11-12_reset_rcparams_in_clf.rst | 5 ++++ lib/matplotlib/tests/test_figure.py | 26 +++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 doc/users/next_whats_new/2017-11-12_reset_rcparams_in_clf.rst diff --git a/doc/users/next_whats_new/2017-11-12_reset_rcparams_in_clf.rst b/doc/users/next_whats_new/2017-11-12_reset_rcparams_in_clf.rst new file mode 100644 index 000000000000..9e6b3119d08f --- /dev/null +++ b/doc/users/next_whats_new/2017-11-12_reset_rcparams_in_clf.rst @@ -0,0 +1,5 @@ +rcParams can be reset in clf +---------------------------- + +``figure.clf()`` can take an optional argument ``reset_rcparams``. If set to ``True``, +unset figure properties will be set to the values specified in rcParams. diff --git a/lib/matplotlib/tests/test_figure.py b/lib/matplotlib/tests/test_figure.py index 6aec2d81a68f..93b314d0d29e 100644 --- a/lib/matplotlib/tests/test_figure.py +++ b/lib/matplotlib/tests/test_figure.py @@ -68,6 +68,32 @@ def test_clf_keyword(): assert [t.get_text() for t in fig2.texts] == [] +def test_reset_rcparams(): + # test whether clf resets unset figure properties to rcParams values + fig0 = plt.figure() + fig0.figsize = None + fig0.facecolor = None + fig0.edgecolor = None + fig0.frameon = None + fig0.clf(reset_rcparams=True) + assert fig0.figsize == rcParams['figure.figsize'] + assert fig0.facecolor == rcParams['figure.facecolor'] + assert fig0.edgecolor == rcParams['figure.edgecolor'] + assert fig0.frameon == rcParams['figure.frameon'] + + # set figure properties should not be reset to rcParams + fig1 = plt.figure() + fig1.figsize = (10, 10) + fig1.facecolor = 'red' + fig1.edgecolor = 'blue' + fig1.frameon = False + fig1.clf(reset_rcparams=True) + assert not fig1.figsize == rcParams['figure.figsize'] + assert not fig1.facecolor == rcParams['figure.facecolor'] + assert not fig1.edgecolor == rcParams['figure.edgecolor'] + assert not fig1.frameon == rcParams['figure.frameon'] + + @image_comparison(baseline_images=['figure_today']) def test_figure(): # named figure support From 32623e98f7d1edd0581305243d0f5de9f1585179 Mon Sep 17 00:00:00 2001 From: NNiehof Date: Mon, 13 Nov 2017 12:06:21 +0100 Subject: [PATCH 4/7] unbroke tight_layout fixed error: accidentally overwrote fig.tight_layout --- lib/matplotlib/figure.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/figure.py b/lib/matplotlib/figure.py index fc1a4bd432cb..ab3ae420b084 100644 --- a/lib/matplotlib/figure.py +++ b/lib/matplotlib/figure.py @@ -367,7 +367,7 @@ def __init__(self, self.subplotpars = subplotpars self.set_tight_layout(tight_layout) - self.tight_layout = tight_layout + self.tight = tight_layout self._axstack = AxesStack() # track all figure axes and current axes self.clf() @@ -1268,7 +1268,7 @@ def clf(self, keep_observers=False, reset_rcparams=False): if self.frameon is None: self.frameon = rcParams['figure.frameon'] self.subplotpars.update() - self.set_tight_layout(self.tight_layout) + self.set_tight_layout(self.tight) self._suptitle = None self.stale = True From 6bb6736cfced67f6fa9822259ea1789fec955ce6 Mon Sep 17 00:00:00 2001 From: NNiehof Date: Sun, 19 Nov 2017 23:04:48 +0100 Subject: [PATCH 5/7] fixed setting of fig properties new figure properties set to private, and set the properties to their new values --- lib/matplotlib/figure.py | 30 ++++++++++++++--------- lib/matplotlib/tests/test_figure.py | 37 +++++++++++++++++------------ 2 files changed, 41 insertions(+), 26 deletions(-) diff --git a/lib/matplotlib/figure.py b/lib/matplotlib/figure.py index ab3ae420b084..8a4d98a190c4 100644 --- a/lib/matplotlib/figure.py +++ b/lib/matplotlib/figure.py @@ -336,7 +336,7 @@ def __init__(self, raise ValueError('figure size must be finite not ' '{}'.format(figsize)) self.bbox_inches = Bbox.from_bounds(0, 0, *figsize) - self.figsize = figsize + self._figsize = figsize self.dpi_scale_trans = Affine2D().scale(dpi, dpi) # do not use property as it will trigger @@ -352,8 +352,8 @@ def __init__(self, facecolor=facecolor, edgecolor=edgecolor, linewidth=linewidth) self._set_artist_props(self.patch) self.patch.set_aa(False) - self.facecolor = facecolor - self.edgecolor = edgecolor + self._facecolor = facecolor + self._edgecolor = edgecolor self._hold = rcParams['axes.hold'] if self._hold is None: @@ -367,7 +367,7 @@ def __init__(self, self.subplotpars = subplotpars self.set_tight_layout(tight_layout) - self.tight = tight_layout + self._tight = tight_layout self._axstack = AxesStack() # track all figure axes and current axes self.clf() @@ -1259,16 +1259,24 @@ def clf(self, keep_observers=False, reset_rcparams=False): if not keep_observers: self._axobservers = [] if reset_rcparams: - if self.figsize is None: - self.figsize = rcParams['figure.figsize'] - if self.facecolor is None: - self.facecolor = rcParams['figure.facecolor'] - if self.edgecolor is None: - self.edgecolor = rcParams['figure.edgecolor'] + if self._figsize is None: + self._figsize = rcParams['figure.figsize'] + if self._dpi is None: + self._dpi = rcParams['figure.dpi'] + if self._facecolor is None: + self._facecolor = rcParams['figure.facecolor'] + if self._edgecolor is None: + self._edgecolor = rcParams['figure.edgecolor'] if self.frameon is None: self.frameon = rcParams['figure.frameon'] + self.bbox_inches = Bbox.from_bounds(0, 0, *self._figsize) + self.dpi_scale_trans = Affine2D().scale(self._dpi, self._dpi) + self.bbox = TransformedBbox(self.bbox_inches, self.dpi_scale_trans) + self.transFigure = BboxTransformTo(self.bbox) + self.set_facecolor(self._facecolor) + self.set_edgecolor(self._edgecolor) self.subplotpars.update() - self.set_tight_layout(self.tight) + self.set_tight_layout(self._tight) self._suptitle = None self.stale = True diff --git a/lib/matplotlib/tests/test_figure.py b/lib/matplotlib/tests/test_figure.py index 93b314d0d29e..0eedd3b8cd4b 100644 --- a/lib/matplotlib/tests/test_figure.py +++ b/lib/matplotlib/tests/test_figure.py @@ -6,6 +6,7 @@ from matplotlib.axes import Axes from matplotlib.ticker import AutoMinorLocator, FixedFormatter import matplotlib.pyplot as plt +import matplotlib.colors as colors import matplotlib.dates as mdates import numpy as np import warnings @@ -71,27 +72,33 @@ def test_clf_keyword(): def test_reset_rcparams(): # test whether clf resets unset figure properties to rcParams values fig0 = plt.figure() - fig0.figsize = None - fig0.facecolor = None - fig0.edgecolor = None + fig0._figsize = None + fig0._dpi = None + fig0._facecolor = None + fig0._edgecolor = None fig0.frameon = None fig0.clf(reset_rcparams=True) - assert fig0.figsize == rcParams['figure.figsize'] - assert fig0.facecolor == rcParams['figure.facecolor'] - assert fig0.edgecolor == rcParams['figure.edgecolor'] - assert fig0.frameon == rcParams['figure.frameon'] + assert fig0.get_figwidth() == rcParams['figure.figsize'][0] + assert fig0.get_figheight() == rcParams['figure.figsize'][1] + assert fig0.get_dpi() == rcParams['figure.dpi'] + assert fig0.get_facecolor() == colors.to_rgba(rcParams['figure.facecolor']) + assert fig0.get_edgecolor() == colors.to_rgba(rcParams['figure.edgecolor']) + assert fig0.get_frameon() == rcParams['figure.frameon'] # set figure properties should not be reset to rcParams fig1 = plt.figure() - fig1.figsize = (10, 10) - fig1.facecolor = 'red' - fig1.edgecolor = 'blue' - fig1.frameon = False + fig1._figsize = (11, 13) + fig1._figsize + fig1._dpi = 251 + fig1._facecolor = 'red' + fig1._edgecolor = 'blue' fig1.clf(reset_rcparams=True) - assert not fig1.figsize == rcParams['figure.figsize'] - assert not fig1.facecolor == rcParams['figure.facecolor'] - assert not fig1.edgecolor == rcParams['figure.edgecolor'] - assert not fig1.frameon == rcParams['figure.frameon'] + fig1._figsize + assert not fig1.get_figwidth() == rcParams['figure.figsize'][0] + assert not fig1.get_figheight() == rcParams['figure.figsize'][1] + assert not fig1.get_dpi() == rcParams['figure.dpi'] + assert not fig1.get_facecolor() == colors.to_rgba(rcParams['figure.facecolor']) + assert not fig1.get_edgecolor() == colors.to_rgba(rcParams['figure.edgecolor']) @image_comparison(baseline_images=['figure_today']) From 16730489c3a24d2a0a319b51d5f7bfffcd14e387 Mon Sep 17 00:00:00 2001 From: NNiehof Date: Mon, 20 Nov 2017 10:53:07 +0100 Subject: [PATCH 6/7] fixed: travisCI failed on pep8 line length --- lib/matplotlib/tests/test_figure.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/tests/test_figure.py b/lib/matplotlib/tests/test_figure.py index 0eedd3b8cd4b..7fd0f9190611 100644 --- a/lib/matplotlib/tests/test_figure.py +++ b/lib/matplotlib/tests/test_figure.py @@ -97,8 +97,10 @@ def test_reset_rcparams(): assert not fig1.get_figwidth() == rcParams['figure.figsize'][0] assert not fig1.get_figheight() == rcParams['figure.figsize'][1] assert not fig1.get_dpi() == rcParams['figure.dpi'] - assert not fig1.get_facecolor() == colors.to_rgba(rcParams['figure.facecolor']) - assert not fig1.get_edgecolor() == colors.to_rgba(rcParams['figure.edgecolor']) + assert not fig1.get_facecolor() == colors.to_rgba( + rcParams['figure.facecolor']) + assert not fig1.get_edgecolor() == colors.to_rgba( + rcParams['figure.edgecolor']) @image_comparison(baseline_images=['figure_today']) From e44a6a049bc523157b75e0dc22b484e3e2dbedbb Mon Sep 17 00:00:00 2001 From: NNiehof Date: Sun, 10 Dec 2017 21:14:21 +0100 Subject: [PATCH 7/7] changed clf docstring --- lib/matplotlib/figure.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/matplotlib/figure.py b/lib/matplotlib/figure.py index 8a4d98a190c4..247724f94426 100644 --- a/lib/matplotlib/figure.py +++ b/lib/matplotlib/figure.py @@ -1234,10 +1234,14 @@ def clf(self, keep_observers=False, reset_rcparams=False): """ Clear the figure. - Set *keep_observers* to True if, for example, - a gui widget is tracking the axes in the figure. - Set *reset_rcparams* to True to reset figure - parameters to rcParams values. + Parameters + ---------- + keep_observers : bool, optional + Set *keep_observers* to True if, for example, + a gui widget is tracking the axes in the figure. + reset_rcparams : bool, optional + Set *reset_rcparams* to True to reset figure + parameters to rcParams values. """ self.suppressComposite = None self.callbacks = cbook.CallbackRegistry()