From 0f54311c24418a89d80f0f1c58322354ad79a8c5 Mon Sep 17 00:00:00 2001 From: Ye Chang Date: Sat, 11 Apr 2020 18:58:32 +0800 Subject: [PATCH 1/4] Make Spines accessable by the attributes. --- examples/specialty_plots/skewt.py | 10 ++++++---- lib/matplotlib/axes/_base.py | 3 +-- lib/matplotlib/projections/polar.py | 3 +-- lib/matplotlib/spines.py | 15 +++++++++++++++ lib/matplotlib/tests/test_skew.py | 10 ++++++---- 5 files changed, 29 insertions(+), 12 deletions(-) diff --git a/examples/specialty_plots/skewt.py b/examples/specialty_plots/skewt.py index f77afcc49f10..0f5dd770f50e 100644 --- a/examples/specialty_plots/skewt.py +++ b/examples/specialty_plots/skewt.py @@ -93,10 +93,12 @@ def _init_axis(self): self.spines['right'].register_axis(self.yaxis) def _gen_axes_spines(self): - spines = {'top': SkewSpine.linear_spine(self, 'top'), - 'bottom': mspines.Spine.linear_spine(self, 'bottom'), - 'left': mspines.Spine.linear_spine(self, 'left'), - 'right': mspines.Spine.linear_spine(self, 'right')} + spines = mspines._Spines({ + 'top': SkewSpine.linear_spine(self, 'top'), + 'bottom': mspines.Spine.linear_spine(self, 'bottom'), + 'left': mspines.Spine.linear_spine(self, 'left'), + 'right': mspines.Spine.linear_spine(self, 'right') + }) return spines def _set_lim_and_transforms(self): diff --git a/lib/matplotlib/axes/_base.py b/lib/matplotlib/axes/_base.py index 61a0d64cd86f..a4d684d9f14b 100644 --- a/lib/matplotlib/axes/_base.py +++ b/lib/matplotlib/axes/_base.py @@ -1,4 +1,3 @@ -from collections import OrderedDict from contextlib import ExitStack import inspect import itertools @@ -1002,7 +1001,7 @@ def _gen_axes_spines(self, locations=None, offset=0.0, units='inches'): ----- Intended to be overridden by new projection types. """ - return OrderedDict((side, mspines.Spine.linear_spine(self, side)) + return mspines._Spines((side, mspines.Spine.linear_spine(self, side)) for side in ['left', 'right', 'bottom', 'top']) def sharex(self, other): diff --git a/lib/matplotlib/projections/polar.py b/lib/matplotlib/projections/polar.py index 007308fb4933..8b6141e442ad 100644 --- a/lib/matplotlib/projections/polar.py +++ b/lib/matplotlib/projections/polar.py @@ -1,4 +1,3 @@ -from collections import OrderedDict import types import numpy as np @@ -996,7 +995,7 @@ def _gen_axes_patch(self): return mpatches.Wedge((0.5, 0.5), 0.5, 0.0, 360.0) def _gen_axes_spines(self): - spines = OrderedDict([ + spines = mspines._Spines([ ('polar', mspines.Spine.arc_spine(self, 'top', (0.5, 0.5), 0.5, 0.0, 360.0)), ('start', mspines.Spine.linear_spine(self, 'left')), diff --git a/lib/matplotlib/spines.py b/lib/matplotlib/spines.py index 757918e0d9bc..5777b9a91304 100644 --- a/lib/matplotlib/spines.py +++ b/lib/matplotlib/spines.py @@ -1,4 +1,5 @@ import numpy as np +from collections import OrderedDict import matplotlib from matplotlib import cbook, docstring, rcParams @@ -534,3 +535,17 @@ def set_color(self, c): """ self.set_edgecolor(c) self.stale = True + + +class _Spines(OrderedDict): + """ + A collection of multiple axis spines. + + _Spines can be accessed by both key and attribute. + + """ + def __getattr__(self, key): + return self[key] + + def __setattr__(self, key, value): + self[key] = value diff --git a/lib/matplotlib/tests/test_skew.py b/lib/matplotlib/tests/test_skew.py index 324d53492b41..f0d1ff654f97 100644 --- a/lib/matplotlib/tests/test_skew.py +++ b/lib/matplotlib/tests/test_skew.py @@ -83,10 +83,12 @@ def _init_axis(self): self.spines['right'].register_axis(self.yaxis) def _gen_axes_spines(self): - spines = {'top': SkewSpine.linear_spine(self, 'top'), - 'bottom': mspines.Spine.linear_spine(self, 'bottom'), - 'left': mspines.Spine.linear_spine(self, 'left'), - 'right': mspines.Spine.linear_spine(self, 'right')} + spines = spines._Spines({ + 'top': SkewSpine.linear_spine(self, 'top'), + 'bottom': mspines.Spine.linear_spine(self, 'bottom'), + 'left': mspines.Spine.linear_spine(self, 'left'), + 'right': mspines.Spine.linear_spine(self, 'right') + }) return spines def _set_lim_and_transforms(self): From d2a06c4bf3794d315722b0d13aada4959970ca23 Mon Sep 17 00:00:00 2001 From: Ye Chang Date: Sat, 11 Apr 2020 19:39:51 +0800 Subject: [PATCH 2/4] fix typo --- lib/matplotlib/tests/test_skew.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/tests/test_skew.py b/lib/matplotlib/tests/test_skew.py index f0d1ff654f97..eb98a412df6c 100644 --- a/lib/matplotlib/tests/test_skew.py +++ b/lib/matplotlib/tests/test_skew.py @@ -83,7 +83,7 @@ def _init_axis(self): self.spines['right'].register_axis(self.yaxis) def _gen_axes_spines(self): - spines = spines._Spines({ + spines = mspines._Spines({ 'top': SkewSpine.linear_spine(self, 'top'), 'bottom': mspines.Spine.linear_spine(self, 'bottom'), 'left': mspines.Spine.linear_spine(self, 'left'), From 277eecad0e75e89d09d77155e96e5cbdcccf623d Mon Sep 17 00:00:00 2001 From: Ye Chang Date: Sun, 12 Apr 2020 03:48:57 +0800 Subject: [PATCH 3/4] OMG... Flake8 --- lib/matplotlib/axes/_base.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/axes/_base.py b/lib/matplotlib/axes/_base.py index a4d684d9f14b..aa67c6199a62 100644 --- a/lib/matplotlib/axes/_base.py +++ b/lib/matplotlib/axes/_base.py @@ -1001,8 +1001,10 @@ def _gen_axes_spines(self, locations=None, offset=0.0, units='inches'): ----- Intended to be overridden by new projection types. """ - return mspines._Spines((side, mspines.Spine.linear_spine(self, side)) - for side in ['left', 'right', 'bottom', 'top']) + return mspines._Spines( + (side, mspines.Spine.linear_spine(self, side)) + for side in ['left', 'right', 'bottom', 'top'] + ) def sharex(self, other): """ From a539d7afecd3c1f22cb437cf89787f362ca5c8bd Mon Sep 17 00:00:00 2001 From: Ye Chang Date: Sun, 12 Apr 2020 15:30:29 +0800 Subject: [PATCH 4/4] Add spine type name into entry of `_Spines` object - change `__dir__` of OrderedDict --- lib/matplotlib/spines.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/matplotlib/spines.py b/lib/matplotlib/spines.py index 5777b9a91304..e7680d2fed9a 100644 --- a/lib/matplotlib/spines.py +++ b/lib/matplotlib/spines.py @@ -544,6 +544,9 @@ class _Spines(OrderedDict): _Spines can be accessed by both key and attribute. """ + def __dir__(self): + return super().__dir__() + list(self.keys()) + def __getattr__(self, key): return self[key]