From 4d6448ab5b392a943b7f3f704dfe5b18c0764aa4 Mon Sep 17 00:00:00 2001 From: Eric Firing Date: Mon, 12 Jun 2017 07:31:16 -1000 Subject: [PATCH] Clarify axis sharing with aspect ratio control - Axis sharing works across figures. - The "box-forced" adjustable is no longer needed. - Sharing both axes requires the use of "box", not "datalim". - A new "share" kwarg triggers synchronized setting of aspect ratio and adjustable in Axes within shared axis groups. - Added a test for axis sharing with aspect ratio setting. - Fixed and updated skew_rects test. --- lib/matplotlib/axes/_base.py | 201 +- lib/matplotlib/axes/_subplots.py | 7 +- .../baseline_images/test_skew/skew_rects.pdf | Bin 7470 -> 7923 bytes .../baseline_images/test_skew/skew_rects.png | Bin 31973 -> 22740 bytes .../baseline_images/test_skew/skew_rects.svg | 3118 ++++++++--------- lib/matplotlib/tests/test_axes.py | 55 + lib/matplotlib/tests/test_skew.py | 10 +- lib/mpl_toolkits/axes_grid1/axes_divider.py | 5 + 8 files changed, 1746 insertions(+), 1650 deletions(-) diff --git a/lib/matplotlib/axes/_base.py b/lib/matplotlib/axes/_base.py index 6c0556b20fdb..291a8b6c1eaf 100644 --- a/lib/matplotlib/axes/_base.py +++ b/lib/matplotlib/axes/_base.py @@ -414,6 +414,7 @@ class _AxesBase(martist.Artist): _shared_x_axes = cbook.Grouper() _shared_y_axes = cbook.Grouper() + _twinned_axes = cbook.Grouper() def __str__(self): return "{0}({1[0]:g},{1[1]:g};{1[2]:g}x{1[3]:g})".format( @@ -440,7 +441,7 @@ def __init__(self, fig, rect, ================ ========================================= Keyword Description ================ ========================================= - *adjustable* [ 'box' | 'datalim' | 'box-forced'] + *adjustable* [ 'box' | 'datalim' ] *alpha* float: the alpha transparency (can be None) *anchor* [ 'C', 'SW', 'S', 'SE', 'E', 'NE', 'N', 'NW', 'W' ] @@ -488,25 +489,15 @@ def __init__(self, fig, rect, self._originalPosition = self._position.frozen() # self.set_axes(self) self.axes = self - self.set_aspect('auto') + self._aspect = 'auto' self._adjustable = 'box' - self.set_anchor('C') + self._anchor = 'C' self._sharex = sharex self._sharey = sharey if sharex is not None: self._shared_x_axes.join(self, sharex) - if sharex._adjustable == 'box': - sharex._adjustable = 'datalim' - # warnings.warn( - # 'shared axes: "adjustable" is being changed to "datalim"') - self._adjustable = 'datalim' if sharey is not None: self._shared_y_axes.join(self, sharey) - if sharey._adjustable == 'box': - sharey._adjustable = 'datalim' - # warnings.warn( - # 'shared axes: "adjustable" is being changed to "datalim"') - self._adjustable = 'datalim' self.set_label(label) self.set_figure(fig) @@ -530,6 +521,7 @@ def __init__(self, fig, rect, self._connected = {} # a dict from events to (id, func) self.cla() + # funcs used to format x and y - fall back on major formatters self.fmt_xdata = None self.fmt_ydata = None @@ -630,8 +622,7 @@ def set_figure(self, fig): def _set_lim_and_transforms(self): """ - set the *dataLim* and *viewLim* - :class:`~matplotlib.transforms.Bbox` attributes and the + set the *_xaxis_transform*, *_yaxis_transform*, *transScale*, *transData*, *transLimits* and *transAxes* transformations. @@ -881,10 +872,11 @@ def set_position(self, pos, which='both'): """ if not isinstance(pos, mtransforms.BboxBase): pos = mtransforms.Bbox.from_bounds(*pos) - if which in ('both', 'active'): - self._position.set(pos) - if which in ('both', 'original'): - self._originalPosition.set(pos) + for ax in self._twinned_axes.get_siblings(self): + if which in ('both', 'active'): + ax._position.set(pos) + if which in ('both', 'original'): + ax._originalPosition.set(pos) self.stale = True def reset_position(self): @@ -894,8 +886,9 @@ def reset_position(self): This resets the a possible position change due to aspect constraints. For an explanation of the positions see `.set_position`. """ - pos = self.get_position(original=True) - self.set_position(pos, which='active') + for ax in self._twinned_axes.get_siblings(self): + pos = ax.get_position(original=True) + ax.set_position(pos, which='active') def set_axes_locator(self, locator): """ @@ -980,6 +973,7 @@ def cla(self): self.xaxis.cla() self.yaxis.cla() + for name, spine in six.iteritems(self.spines): spine.cla() @@ -987,7 +981,7 @@ def cla(self): self.callbacks = cbook.CallbackRegistry() if self._sharex is not None: - # major and minor are class instances with + # major and minor are axis.Ticker class instances with # locator and formatter attributes self.xaxis.major = self._sharex.xaxis.major self.xaxis.minor = self._sharex.xaxis.minor @@ -1015,7 +1009,6 @@ def cla(self): self.set_ylim(0, 1) except TypeError: pass - # update the minor locator for x and y axis based on rcParams if (rcParams['xtick.minor.visible']): self.xaxis.set_minor_locator(mticker.AutoMinorLocator()) @@ -1257,7 +1250,7 @@ def hold(self, b=None): def get_aspect(self): return self._aspect - def set_aspect(self, aspect, adjustable=None, anchor=None): + def set_aspect(self, aspect, adjustable=None, anchor=None, share=False): """ Set the aspect of the axis scaling, i.e. the ratio of y-unit to x-unit. @@ -1276,7 +1269,7 @@ def set_aspect(self, aspect, adjustable=None, anchor=None): aspect='equal'. ======== ================================================ - adjustable : None or ['box' | 'datalim' | 'box-forced'], optional + adjustable : None or ['box' | 'datalim'], optional If not ``None``, this defines which parameter will be adjusted to meet the required aspect. See `.set_adjustable` for further details. @@ -1298,6 +1291,10 @@ def set_aspect(self, aspect, adjustable=None, anchor=None): See `.set_anchor` for further details. + share : bool, optional + If ``True``, apply the settings to all shared Axes. + Default is ``False``. + See Also -------- matplotlib.axes.Axes.set_adjustable @@ -1306,54 +1303,73 @@ def set_aspect(self, aspect, adjustable=None, anchor=None): matplotlib.axes.Axes.set_anchor defining the position in case of extra space. """ - if (isinstance(aspect, six.string_types) + if not (isinstance(aspect, six.string_types) and aspect in ('equal', 'auto')): - self._aspect = aspect + aspect = float(aspect) # raise ValueError if necessary + if share: + axes = set(self._shared_x_axes.get_siblings(self) + + self._shared_y_axes.get_siblings(self)) else: - self._aspect = float(aspect) # raise ValueError if necessary + axes = [self] + for ax in axes: + ax._aspect = aspect + + if adjustable is None: + adjustable = self._adjustable + self.set_adjustable(adjustable, share=share) # Handle sharing. - if adjustable is not None: - self.set_adjustable(adjustable) if anchor is not None: - self.set_anchor(anchor) + self.set_anchor(anchor, share=share) self.stale = True def get_adjustable(self): return self._adjustable - def set_adjustable(self, adjustable): + def set_adjustable(self, adjustable, share=False): """ Define which parameter the Axes will change to achieve a given aspect. - Possible values are: - - ============ ===================================== - value description - ============ ===================================== - 'box' change the physical size of the Axes - 'datalim' change xlim or ylim - 'box-forced' same as 'box', but axes can be shared - ============ ===================================== + Parameters + ---------- + adjustable : ['box' | 'datalim'] + If 'box', change the physical dimensions of the Axes. + If 'datalim', change the ``x`` or ``y`` data limits. - 'box' does not allow axes sharing, as this can cause - unintended side effect. For cases when sharing axes is - fine, use 'box-forced'. + share : bool, optional + If ``True``, apply the settings to all shared Axes. + Default is ``False``. - .. ACCEPTS: [ 'box' | 'datalim' | 'box-forced' ] + .. ACCEPTS: [ 'box' | 'datalim'] See Also -------- matplotlib.axes.Axes.set_aspect for a description of aspect handling. - """ - if adjustable in ('box', 'datalim', 'box-forced'): - if self in self._shared_x_axes or self in self._shared_y_axes: - if adjustable == 'box': - raise ValueError( - 'adjustable must be "datalim" for shared axes') - self._adjustable = adjustable + + Notes + ----- + Shared Axes (of which twinned Axes are a special case) + impose restrictions on how aspect ratios can be imposed. + For twinned Axes, use 'datalim'. For Axes that share both + x and y, use 'box'. Otherwise, either 'datalim' or 'box' + may be used. These limitations are partly a requirement + to avoid over-specification, and partly a result of the + particular implementation we are currently using, in + which the adjustments for aspect ratios are done sequentially + and independently on each Axes as it is drawn. + """ + if adjustable == 'box-forced': + warnings.warn("The 'box-forced' keyword argument is deprecated" + " since 2.2.", cbook.mplDeprecation) + if adjustable not in ('box', 'datalim', 'box-forced'): + raise ValueError("argument must be 'box', or 'datalim'") + if share: + axes = set(self._shared_x_axes.get_siblings(self) + + self._shared_y_axes.get_siblings(self)) else: - raise ValueError('argument must be "box", or "datalim"') + axes = [self] + for ax in axes: + ax._adjustable = adjustable self.stale = True def get_anchor(self): @@ -1369,7 +1385,7 @@ def get_anchor(self): """ return self._anchor - def set_anchor(self, anchor): + def set_anchor(self, anchor, share=False): """ Define the anchor location. @@ -1405,16 +1421,26 @@ def set_anchor(self, anchor): | 'SW' | 'S' | 'SE' | +------+------+------+ + share : bool, optional + If ``True``, apply the settings to all shared Axes. + Default is ``False``. + See Also -------- matplotlib.axes.Axes.set_aspect for a description of aspect handling. """ - if anchor in mtransforms.Bbox.coefs or len(anchor) == 2: - self._anchor = anchor - else: + if not (anchor in mtransforms.Bbox.coefs or len(anchor) == 2): raise ValueError('argument must be among %s' % ', '.join(mtransforms.Bbox.coefs)) + if share: + axes = set(self._shared_x_axes.get_siblings(self) + + self._shared_y_axes.get_siblings(self)) + else: + axes = [self] + for ax in axes: + ax._anchor = anchor + self.stale = True def get_data_ratio(self): @@ -1447,21 +1473,22 @@ def get_data_ratio_log(self): def apply_aspect(self, position=None): """ - Adjust the Axes so that it fulfills its aspect setting. + Adjust the Axes for a specified data aspect ratio. - Depending on `.get_adjustable` and `.get_anchor` this will either - modify the Axes box or the view limits. + Depending on `.get_adjustable` this will modify either the Axes box + (position) or the view limits. In the former case, `.get_anchor` + will affect the position. Notes ----- - This is automatically called on draw. So you won't need to call this - yourself in most cases. One exception may be if you need to update the - Axes before drawing. + This is called automatically when each Axes is drawn. You may need + to call it yourself if you need to update the Axes position and/or + view limits before the Figure is drawn. See Also -------- matplotlib.axes.Axes.set_aspect - for a description of aspect handling. + for a description of aspect ratio handling. matplotlib.axes.Axes.set_adjustable defining the parameter to adjust in order to meet the required aspect. @@ -1500,17 +1527,12 @@ def apply_aspect(self, position=None): else: A = aspect - # Ensure at drawing time that any Axes involved in axis-sharing - # does not have its position changed. - if self in self._shared_x_axes or self in self._shared_y_axes: - if self._adjustable == 'box': - self._adjustable = 'datalim' - warnings.warn( - 'shared axes: "adjustable" is being changed to "datalim"') - figW, figH = self.get_figure().get_size_inches() fig_aspect = figH / figW if self._adjustable in ['box', 'box-forced']: + if self in self._twinned_axes: + raise RuntimeError("Adjustable 'box' is not allowed in a" + " twinned Axes. Use 'datalim' instead.") if aspect_scale_mode == "log": box_aspect = A * self.get_data_ratio_log() else: @@ -1565,15 +1587,15 @@ def apply_aspect(self, position=None): xm = 0 ym = 0 - changex = (self in self._shared_y_axes and - self not in self._shared_x_axes) - changey = (self in self._shared_x_axes and - self not in self._shared_y_axes) - if changex and changey: - warnings.warn("adjustable='datalim' cannot work with shared " - "x and y axes") - return - if changex: + shared_x = self in self._shared_x_axes + shared_y = self in self._shared_y_axes + # Not sure whether we need this check: + if shared_x and shared_y: + raise RuntimeError("adjustable='datalim' is not allowed when both" + " axes are shared.") + + # If y is shared, then we are only allowed to change x, etc. + if shared_y: adjust_y = False else: if xmarg > xm and ymarg > ym: @@ -1581,7 +1603,8 @@ def apply_aspect(self, position=None): (Xmarg < 0 and y_expander > 0)) else: adjy = y_expander > 0 - adjust_y = changey or adjy # (Ymarg > xmarg) + adjust_y = shared_x or adjy # (Ymarg > xmarg) + if adjust_y: yc = 0.5 * (ymin + ymax) y0 = yc - Ysize / 2.0 @@ -4118,9 +4141,17 @@ def get_tightbbox(self, renderer, call_axes_locator=True): def _make_twin_axes(self, *kl, **kwargs): """ - make a twinx axes of self. This is used for twinx and twiny. + Make a twinx axes of self. This is used for twinx and twiny. """ + # Typically, SubplotBase._make_twin_axes is called instead of this. + # There is also an override in axes_grid1/axes_divider.py. + if 'sharex' in kwargs and 'sharey' in kwargs: + raise ValueError("Twinned Axes may share only one axis.") ax2 = self.figure.add_axes(self.get_position(True), *kl, **kwargs) + ## do not touch every thing shared, just this and it's twin. + self.set_adjustable('datalim') + ax2.set_adjustable('datalim') + self._twinned_axes.join(self, ax2) return ax2 def twinx(self): @@ -4183,9 +4214,9 @@ def twiny(self): return ax2 def get_shared_x_axes(self): - """Return a copy of the shared axes Grouper object for x axes.""" + """Return a reference to the shared axes Grouper object for x axes.""" return self._shared_x_axes def get_shared_y_axes(self): - """Return a copy of the shared axes Grouper object for y axes.""" + """Return a reference to the shared axes Grouper object for y axes.""" return self._shared_y_axes diff --git a/lib/matplotlib/axes/_subplots.py b/lib/matplotlib/axes/_subplots.py index 10979bfd2c2f..9c033c728889 100644 --- a/lib/matplotlib/axes/_subplots.py +++ b/lib/matplotlib/axes/_subplots.py @@ -144,9 +144,11 @@ def label_outer(self): def _make_twin_axes(self, *kl, **kwargs): """ - make a twinx axes of self. This is used for twinx and twiny. + Make a twinx axes of self. This is used for twinx and twiny. """ from matplotlib.projections import process_projection_requirements + if 'sharex' in kwargs and 'sharey' in kwargs: + raise ValueError("Twinned Axes may share only one axis.") kl = (self.get_subplotspec(),) + kl projection_class, kwargs, key = process_projection_requirements( self.figure, *kl, **kwargs) @@ -154,6 +156,9 @@ def _make_twin_axes(self, *kl, **kwargs): ax2 = subplot_class_factory(projection_class)(self.figure, *kl, **kwargs) self.figure.add_subplot(ax2) + self.set_adjustable('datalim') + ax2.set_adjustable('datalim') + self._twinned_axes.join(self, ax2) return ax2 _subplot_classes = {} diff --git a/lib/matplotlib/tests/baseline_images/test_skew/skew_rects.pdf b/lib/matplotlib/tests/baseline_images/test_skew/skew_rects.pdf index 209842345b463aa2c0030d50488ac46e4b7a266a..c16fc9c2d916904dc79b2fbd5743088668183f08 100644 GIT binary patch literal 7923 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
_m1wt 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 diff --git a/lib/matplotlib/tests/baseline_images/test_skew/skew_rects.svg b/lib/matplotlib/tests/baseline_images/test_skew/skew_rects.svg index 668efde6a8ad..ff18e2b4df0b 100644 --- a/lib/matplotlib/tests/baseline_images/test_skew/skew_rects.svg +++ b/lib/matplotlib/tests/baseline_images/test_skew/skew_rects.svg @@ -2,7 +2,7 @@ - + - - - - - - - @@ -60,188 +60,188 @@ L 230.4 86.4 +" id="m368fc901b1" style="stroke:#000000;stroke-width:0.5;"/> - + +" id="mc63e59a608" style="stroke:#000000;stroke-width:0.5;"/> - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + - + + + + - + - + - + - + - - - + - - - - + - - - - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -249,209 +249,209 @@ L -4 0 - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + - + - + - + - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -459,209 +459,209 @@ L 460.8 86.4 - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + - + - + - + - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -669,209 +669,209 @@ L 691.2 86.4 - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + - + - + - + - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -879,209 +879,209 @@ L 921.6 86.4 - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + - + - + - + - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -1089,209 +1089,209 @@ L 1152 86.4 - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + - + - + - + - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -1299,209 +1299,209 @@ L 230.4 247.282759 - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + - + - + - + - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -1509,209 +1509,209 @@ L 460.8 247.282759 - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + - + - + - + - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -1719,209 +1719,209 @@ L 691.2 247.282759 - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + - + - + - + - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -1929,209 +1929,209 @@ L 921.6 247.282759 - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + - + - + - + - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -2139,209 +2139,209 @@ L 1152 247.282759 - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + - + - + - + - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -2349,209 +2349,209 @@ L 230.4 408.165517 - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + - + - + - + - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -2559,209 +2559,209 @@ L 460.8 408.165517 - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + - + - + - + - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -2769,209 +2769,209 @@ L 691.2 408.165517 - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + - + - + - + - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -2979,209 +2979,209 @@ L 921.6 408.165517 - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + - + - + - + - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -3189,209 +3189,209 @@ L 1152 408.165517 - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + - + - + - + - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -3399,209 +3399,209 @@ L 230.4 569.048276 - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + - + - + - + - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -3609,209 +3609,209 @@ L 460.8 569.048276 - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + - + - + - + - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -3819,209 +3819,209 @@ L 691.2 569.048276 - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + - + - + - + - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -4029,209 +4029,209 @@ L 921.6 569.048276 - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + - + - + - + - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -4239,209 +4239,209 @@ L 1152 569.048276 - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + - + - + - + - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -4449,209 +4449,209 @@ L 230.4 729.931034 - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + - + - + - + - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -4659,209 +4659,209 @@ L 460.8 729.931034 - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + - + - + - + - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -4869,209 +4869,209 @@ L 691.2 729.931034 - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + - + - + - + - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -5079,209 +5079,209 @@ L 921.6 729.931034 - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + - + - + - + - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -5289,80 +5289,80 @@ L 1152 729.931034 - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index a47486369916..16078e93c14e 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -4439,6 +4439,61 @@ def test_empty_shared_subplots(): assert y1 >= 6 +def test_shared_with_aspect_1(): + # allow sharing one axis + for adjustable in ['box', 'datalim']: + fig, axes = plt.subplots(nrows=2, sharex=True) + axes[0].set_aspect(2, adjustable=adjustable, share=True) + assert axes[1].get_aspect() == 2 + assert axes[1].get_adjustable() == adjustable + + fig, axes = plt.subplots(nrows=2, sharex=True) + axes[0].set_aspect(2, adjustable=adjustable) + assert axes[1].get_aspect() == 'auto' + + +def test_shared_with_aspect_2(): + # Share 2 axes only with 'box': + fig, axes = plt.subplots(nrows=2, sharex=True, sharey=True) + axes[0].set_aspect(2, share=True) + axes[0].plot([1, 2], [3, 4]) + axes[1].plot([3, 4], [1, 2]) + plt.draw() # Trigger apply_aspect(). + assert axes[0].get_xlim() == axes[1].get_xlim() + assert axes[0].get_ylim() == axes[1].get_ylim() + + +def test_shared_with_aspect_3(): + # Different aspect ratios: + for adjustable in ['box', 'datalim']: + fig, axes = plt.subplots(nrows=2, sharey=True) + axes[0].set_aspect(2, adjustable=adjustable) + axes[1].set_aspect(0.5, adjustable=adjustable) + axes[0].plot([1, 2], [3, 4]) + axes[1].plot([3, 4], [1, 2]) + plt.draw() # Trigger apply_aspect(). + assert axes[0].get_xlim() != axes[1].get_xlim() + assert axes[0].get_ylim() == axes[1].get_ylim() + fig_aspect = fig.bbox_inches.height / fig.bbox_inches.width + for ax in axes: + p = ax.get_position() + box_aspect = p.height / p.width + lim_aspect = ax.viewLim.height / ax.viewLim.width + expected = fig_aspect * box_aspect / lim_aspect + assert round(expected, 4) == round(ax.get_aspect(), 4) + + +@pytest.mark.parametrize('twin', ('x', 'y')) +def test_twin_with_aspect(twin): + fig, ax = plt.subplots() + # test twinx or twiny + ax_twin = getattr(ax, 'twin{}'.format(twin))() + ax.set_aspect(5) + ax_twin.set_aspect(2) + assert_array_equal(ax.bbox.extents, + ax_twin.bbox.extents) + + def test_relim_visible_only(): x1 = (0., 10.) y1 = (0., 10.) diff --git a/lib/matplotlib/tests/test_skew.py b/lib/matplotlib/tests/test_skew.py index d36f806e63f3..628506f4db48 100644 --- a/lib/matplotlib/tests/test_skew.py +++ b/lib/matplotlib/tests/test_skew.py @@ -190,14 +190,14 @@ def test_set_line_coll_dash_image(): @image_comparison(baseline_images=['skew_rects'], remove_text=True) def test_skew_rectangle(): - fix, axes = plt.subplots(5, 5, sharex=True, sharey=True, figsize=(16, 12)) + fix, axes = plt.subplots(5, 5, sharex=True, sharey=True, figsize=(8, 8)) axes = axes.flat rotations = list(itertools.product([-3, -1, 0, 1, 3], repeat=2)) - axes[0].set_xlim([-4, 4]) - axes[0].set_ylim([-4, 4]) - axes[0].set_aspect('equal') + axes[0].set_xlim([-3, 3]) + axes[0].set_ylim([-3, 3]) + axes[0].set_aspect('equal', share=True) for ax, (xrots, yrots) in zip(axes, rotations): xdeg, ydeg = 45 * xrots, 45 * yrots @@ -208,4 +208,4 @@ def test_skew_rectangle(): transform=t + ax.transData, alpha=0.5, facecolor='coral')) - plt.subplots_adjust(wspace=0, left=0, right=1, bottom=0) + plt.subplots_adjust(wspace=0, left=0.01, right=0.99, bottom=0.01, top=0.99) diff --git a/lib/mpl_toolkits/axes_grid1/axes_divider.py b/lib/mpl_toolkits/axes_grid1/axes_divider.py index c86b2edd4043..b238e73cc5ec 100644 --- a/lib/mpl_toolkits/axes_grid1/axes_divider.py +++ b/lib/mpl_toolkits/axes_grid1/axes_divider.py @@ -915,9 +915,14 @@ def _make_twin_axes(self, *kl, **kwargs): Need to overload so that twinx/twiny will work with these axes. """ + if 'sharex' in kwargs and 'sharey' in kwargs: + raise ValueError("Twinned Axes may share only one axis.") ax2 = type(self)(self.figure, self.get_position(True), *kl, **kwargs) ax2.set_axes_locator(self.get_axes_locator()) self.figure.add_axes(ax2) + self.set_adjustable('datalim') + ax2.set_adjustable('datalim') + self._twinned_axes.join(self, ax2) return ax2 _locatableaxes_classes = {}