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..aa67c6199a62 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,8 +1001,10 @@ 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)) - 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): """ 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..e7680d2fed9a 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,20 @@ 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 __dir__(self): + return super().__dir__() + list(self.keys()) + + 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..eb98a412df6c 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 = 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):