-
-
Notifications
You must be signed in to change notification settings - Fork 7.9k
Fix label_outer in the presence of colorbars. #30098
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -4749,14 +4749,39 @@ def label_outer(self, remove_inner_ticks=False): | |
self._label_outer_yaxis(skip_non_rectangular_axes=False, | ||
remove_inner_ticks=remove_inner_ticks) | ||
|
||
def _get_subplotspec_with_optional_colorbar(self): | ||
""" | ||
Return the subplotspec for this Axes, except that if this Axes has been | ||
moved to a subgridspec to make room for a colorbar, then return the | ||
subplotspec that encloses both this Axes and the colorbar Axes. | ||
""" | ||
ss = self.get_subplotspec() | ||
if not ss: | ||
return | ||
gs = ss.get_gridspec() | ||
# Match against subgridspec hierarchy set up by colorbar.make_axes_gridspec. | ||
if (isinstance(gs, mpl.gridspec.GridSpecFromSubplotSpec) | ||
and gs.nrows * gs.ncols == 6): | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please add a comment what this magic is about. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. done There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Thanks. Basically ok. Would it make more sense that
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I would lean towards the least formal here - the subgridspec trick of making colorbars is pretty clunky, and note that it is explicitly not used by The original ideas behind grid specs and subgridspecs were very good, but unfortunately loses the relationship between sibling axes if you change add the colorbar and make the colorbar and main axes child subgridspecs. |
||
for ax in self.figure.axes: | ||
if (ax is not self | ||
and hasattr(ax, "_colorbar_info") | ||
and ax.get_subplotspec() | ||
and isinstance(ax.get_subplotspec().get_gridspec(), | ||
mpl.gridspec.GridSpecFromSubplotSpec) | ||
and (ax.get_subplotspec().get_gridspec()._subplot_spec | ||
is gs._subplot_spec)): | ||
ss = gs._subplot_spec | ||
break | ||
return ss | ||
|
||
def _label_outer_xaxis(self, *, skip_non_rectangular_axes, | ||
remove_inner_ticks=False): | ||
# see documentation in label_outer. | ||
if skip_non_rectangular_axes and not isinstance(self.patch, | ||
mpl.patches.Rectangle): | ||
return | ||
ss = self.get_subplotspec() | ||
if not ss: | ||
ss = self._get_subplotspec_with_optional_colorbar() | ||
if ss is None: | 8000||
return | ||
label_position = self.xaxis.get_label_position() | ||
if not ss.is_first_row(): # Remove top label/ticklabels/offsettext. | ||
|
@@ -4782,8 +4807,8 @@ def _label_outer_yaxis(self, *, skip_non_rectangular_axes, | |
if skip_non_rectangular_axes and not isinstance(self.patch, | ||
mpl.patches.Rectangle): | ||
return | ||
ss = self.get_subplotspec() | ||
if not ss: | ||
ss = self._get_subplotspec_with_optional_colorbar() | ||
if ss is None: | ||
return | ||
label_position = self.yaxis.get_label_position() | ||
if not ss.is_first_col(): # Remove left label/ticklabels/offsettext. | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -4,6 +4,7 @@ | |
import numpy as np | ||
import pytest | ||
|
||
import matplotlib as mpl | ||
from matplotlib.axes import Axes, SubplotBase | ||
import matplotlib.pyplot as plt | ||
from matplotlib.testing.decorators import check_figures_equal, image_comparison | ||
|
@@ -111,10 +112,13 @@ def test_shared(): | |
|
||
|
||
@pytest.mark.parametrize('remove_ticks', [True, False]) | ||
def test_label_outer(remove_ticks): | ||
f, axs = plt.subplots(2, 2, sharex=True, sharey=True) | ||
@pytest.mark.parametrize('with_colorbar', [True, False]) | ||
def test_label_outer(remove_ticks, with_colorbar): | ||
fig, axs = plt.subplots(2, 2, sharex=True, sharey=True) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Can this get tested with layout=constrained as well? |
||
for ax in axs.flat: | ||
ax.set(xlabel="foo", ylabel="bar") | ||
if with_colorbar: | ||
fig.colorbar(mpl.cm.ScalarMappable(), ax=ax) | ||
ax.label_outer(remove_inner_ticks=remove_ticks) | ||
check_ticklabel_visible( | ||
axs.flat, [False, False, True, True], [True, False, True, False]) | ||
|
Uh oh!
There was an error while loading. Please reload this page.