From 0c0c3d6fce7d48de020ef0d50aa8dc0039f4a559 Mon Sep 17 00:00:00 2001 From: Naoya Kanai Date: Sat, 21 Jan 2017 00:33:54 -0800 Subject: [PATCH] twinx and twiny inherit autoscale setting for shared axis from parent Axes --- lib/matplotlib/axes/_base.py | 30 ++++++++------- .../test_axes/twin_autoscale.png | Bin 0 -> 15561 bytes lib/matplotlib/tests/test_axes.py | 36 ++++++++++++++++++ 3 files changed, 52 insertions(+), 14 deletions(-) create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/twin_autoscale.png diff --git a/lib/matplotlib/axes/_base.py b/lib/matplotlib/axes/_base.py index 94b3f3b255b8..0ea95aed250a 100644 --- a/lib/matplotlib/axes/_base.py +++ b/lib/matplotlib/axes/_base.py @@ -3904,16 +3904,16 @@ def twinx(self): """ Create a twin Axes sharing the xaxis - Create a twin of Axes for generating a plot with a shared - x-axis but independent y-axis. The y-axis of self will have - ticks on left and the returned axes will have ticks on the - right. To ensure tick marks of both axis align, see + Create a new Axes instance with an invisible x-axis and an independent + y-axis positioned opposite to the original one (i.e. at right). The + x-axis autoscale setting will be inherited from the original Axes. + To ensure that the tick marks of both y-axes align, see `~matplotlib.ticker.LinearLocator` Returns ------- - Axis - The newly created axis + ax_twin : Axes + The newly created Axes instance Notes ----- @@ -3924,6 +3924,7 @@ def twinx(self): ax2.yaxis.tick_right() ax2.yaxis.set_label_position('right') ax2.yaxis.set_offset_position('right') + ax2.set_autoscalex_on(self.get_autoscalex_on()) self.yaxis.tick_left() ax2.xaxis.set_visible(False) ax2.patch.set_visible(False) @@ -3933,25 +3934,26 @@ def twiny(self): """ Create a twin Axes sharing the yaxis - Create a twin of Axes for generating a plot with a shared - y-axis but independent x-axis. The x-axis of self will have - ticks on bottom and the returned axes will have ticks on the - top. + Create a new Axes instance with an invisible y-axis and an independent + x-axis positioned opposite to the original one (i.e. at top). The + y-axis autoscale setting will be inherited from the original Axes. + To ensure that the tick marks of both x-axes align, see + `~matplotlib.ticker.LinearLocator` Returns ------- - Axis - The newly created axis + ax_twin : Axes + The newly created Axes instance Notes - ------ + ----- For those who are 'picking' artists while using twiny, pick events are only called for the artists in the top-most axes. """ - ax2 = self._make_twin_axes(sharey=self) ax2.xaxis.tick_top() ax2.xaxis.set_label_position('top') + ax2.set_autoscaley_on(self.get_autoscaley_on()) self.xaxis.tick_bottom() ax2.yaxis.set_visible(False) ax2.patch.set_visible(False) diff --git a/lib/matplotlib/tests/baseline_images/test_axes/twin_autoscale.png b/lib/matplotlib/tests/baseline_images/test_axes/twin_autoscale.png new file mode 100644 index 0000000000000000000000000000000000000000..922eeff5c43decb3fab943dd07f58df6313d826e GIT binary patch literal 15561 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%0DK=)Q;OWLL^`aVlwN(OyW7$UxzAYaHlyClxCx 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