From 98778bbf4e2e951ed72cfc0732ea0fc9e7feaffc Mon Sep 17 00:00:00 2001 From: Kyra Cho Date: Fri, 11 Oct 2024 10:54:27 +0000 Subject: [PATCH] Implement xtick and ytick rotation_mode --- .../xtick_ytick_rotation_modes.rst | 28 +++++++++ .../image_annotated_heatmap.py | 4 +- .../align_labels_demo.py | 6 +- lib/matplotlib/axis.py | 4 +- .../test_text/xtick_rotation_mode.png | Bin 0 -> 43243 bytes .../test_text/ytick_rotation_mode.png | Bin 0 -> 37406 bytes lib/matplotlib/tests/test_text.py | 55 ++++++++++++++++++ lib/matplotlib/text.py | 42 +++++++++++-- lib/matplotlib/text.pyi | 2 + 9 files changed, 131 insertions(+), 10 deletions(-) create mode 100644 doc/users/next_whats_new/xtick_ytick_rotation_modes.rst create mode 100644 lib/matplotlib/tests/baseline_images/test_text/xtick_rotation_mode.png create mode 100644 lib/matplotlib/tests/baseline_images/test_text/ytick_rotation_mode.png diff --git a/doc/users/next_whats_new/xtick_ytick_rotation_modes.rst b/doc/users/next_whats_new/xtick_ytick_rotation_modes.rst new file mode 100644 index 000000000000..56286824ada5 --- /dev/null +++ b/doc/users/next_whats_new/xtick_ytick_rotation_modes.rst @@ -0,0 +1,28 @@ +``xtick`` and ``ytick`` rotation modes +-------------------------------------- + +A new feature has been added for handling rotation of xtick and ytick +labels more intuitively. The new `rotation modes ` +"xtick" and "ytick" automatically adjust the alignment of rotated tick labels, +so that the text points towards their anchor point, i.e. ticks. This works for +all four sides of the plot (bottom, top, left, right), reducing the need for +manual adjustments when rotating labels. + +.. plot:: + :include-source: true + :alt: Example of rotated xtick and ytick labels. + + import matplotlib.pyplot as plt + + fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(7, 3.5), layout='constrained') + + pos = range(5) + labels = ['label'] * 5 + ax1.set_xticks(pos, labels, rotation=-45, rotation_mode='xtick') + ax1.set_yticks(pos, labels, rotation=45, rotation_mode='ytick') + ax2.xaxis.tick_top() + ax2.set_xticks(pos, labels, rotation=-45, rotation_mode='xtick') + ax2.yaxis.tick_right() + ax2.set_yticks(pos, labels, rotation=45, rotation_mode='ytick') + + plt.show() diff --git a/galleries/examples/images_contours_and_fields/image_annotated_heatmap.py b/galleries/examples/images_contours_and_fields/image_annotated_heatmap.py index 2da4e9a1c1cb..df4f204e7fda 100644 --- a/galleries/examples/images_contours_and_fields/image_annotated_heatmap.py +++ b/galleries/examples/images_contours_and_fields/image_annotated_heatmap.py @@ -64,7 +64,7 @@ # Show all ticks and label them with the respective list entries ax.set_xticks(range(len(farmers)), labels=farmers, - rotation=45, ha="right", rotation_mode="anchor") + rotation=45, rotation_mode="xtick") ax.set_yticks(range(len(vegetables)), labels=vegetables) # Loop over data dimensions and create text annotations. @@ -135,7 +135,7 @@ def heatmap(data, row_labels, col_labels, ax=None, # Show all ticks and label them with the respective list entries. ax.set_xticks(range(data.shape[1]), labels=col_labels, - rotation=-30, ha="right", rotation_mode="anchor") + rotation=-30, rotation_mode="xtick") ax.set_yticks(range(data.shape[0]), labels=row_labels) # Let the horizontal axes labeling appear on top. diff --git a/galleries/examples/subplots_axes_and_figures/align_labels_demo.py b/galleries/examples/subplots_axes_and_figures/align_labels_demo.py index abb048ba395c..24f6936b080d 100644 --- a/galleries/examples/subplots_axes_and_figures/align_labels_demo.py +++ b/galleries/examples/subplots_axes_and_figures/align_labels_demo.py @@ -26,7 +26,8 @@ ax.plot(np.arange(1., 0., -0.1) * 2000., np.arange(1., 0., -0.1)) ax.set_title('Title0 1') ax.xaxis.tick_top() -ax.tick_params(axis='x', rotation=55) +ax.set_xticks(ax.get_xticks()) +ax.tick_params(axis='x', rotation=55, rotation_mode='xtick') for i in range(2): @@ -35,7 +36,8 @@ ax.set_ylabel('YLabel1 %d' % i) ax.set_xlabel('XLabel1 %d' % i) if i == 0: - ax.tick_params(axis='x', rotation=55) + ax.set_xticks(ax.get_xticks()) + ax.tick_params(axis='x', rotation=55, rotation_mode='xtick') fig.align_labels() # same as fig.align_xlabels(); fig.align_ylabels() fig.align_titles() diff --git a/lib/matplotlib/axis.py b/lib/matplotlib/axis.py index f258fa904c34..a80de888f13d 100644 --- a/lib/matplotlib/axis.py +++ b/lib/matplotlib/axis.py @@ -149,7 +149,7 @@ def __init__( # grid(color=(1, 1, 1, 0.5), alpha=rcParams['grid.alpha']) # so the that the rcParams default would override color alpha. grid_alpha = mpl.rcParams["grid.alpha"] - grid_kw = {k[5:]: v for k, v in kwargs.items()} + grid_kw = {k[5:]: v for k, v in kwargs.items() if k != "rotation_mode"} self.tick1line = mlines.Line2D( [], [], @@ -1078,7 +1078,7 @@ def _translate_tick_params(kw, reverse=False): 'tick1On', 'tick2On', 'label1On', 'label2On', 'length', 'direction', 'left', 'bottom', 'right', 'top', 'labelleft', 'labelbottom', 'labelright', 'labeltop', - 'labelrotation', + 'labelrotation', 'rotation_mode', *_gridline_param_names] keymap = { diff --git a/lib/matplotlib/tests/baseline_images/test_text/xtick_rotation_mode.png b/lib/matplotlib/tests/baseline_images/test_text/xtick_rotation_mode.png new file mode 100644 index 0000000000000000000000000000000000000000..2485b4ac09b6b2e39fedbd2dc4fc37394fb58aa8 GIT binary patch literal 43243 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 z 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 literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_text/ytick_rotation_mode.png b/lib/matplotlib/tests/baseline_images/test_text/ytick_rotation_mode.png new file mode 100644 index 0000000000000000000000000000000000000000..876ab5d8f9d86767d4a7acca759104d38df09742 GIT binary patch literal 37406 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 literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/test_text.py b/lib/matplotlib/tests/test_text.py index 19262202e5c1..f2b48f08981e 100644 --- a/lib/matplotlib/tests/test_text.py +++ b/lib/matplotlib/tests/test_text.py @@ -1135,3 +1135,58 @@ def test_font_wrap(): plt.text(3, 4, t, family='monospace', ha='right', wrap=True) plt.text(-1, 0, t, fontsize=14, style='italic', ha='left', rotation=-15, wrap=True) + + +def test_ha_for_angle(): + text_instance = Text() + angles = np.arange(0, 360.1, 0.1) + for angle in angles: + alignment = text_instance._ha_for_angle(angle) + assert alignment in ['center', 'left', 'right'] + + +def test_va_for_angle(): + text_instance = Text() + angles = np.arange(0, 360.1, 0.1) + for angle in angles: + alignment = text_instance._va_for_angle(angle) + assert alignment in ['center', 'top', 'baseline'] + + +@image_comparison(baseline_images=['xtick_rotation_mode'], + remove_text=False, extensions=['png'], style='mpl20') +def test_xtick_rotation_mode(): + fig, ax = plt.subplots(figsize=(12, 1)) + ax.set_yticks([]) + ax2 = ax.twiny() + + ax.set_xticks(range(37), ['foo'] * 37, rotation_mode="xtick") + ax2.set_xticks(range(37), ['foo'] * 37, rotation_mode="xtick") + + angles = np.linspace(0, 360, 37) + + for tick, angle in zip(ax.get_xticklabels(), angles): + tick.set_rotation(angle) + for tick, angle in zip(ax2.get_xticklabels(), angles): + tick.set_rotation(angle) + + plt.subplots_adjust(left=0.01, right=0.99, top=.6, bottom=.4) + + +@image_comparison(baseline_images=['ytick_rotation_mode'], + remove_text=False, extensions=['png'], style='mpl20') +def test_ytick_rotation_mode(): + fig, ax = plt.subplots(figsize=(1, 12)) + ax.set_xticks([]) + ax2 = ax.twinx() + + ax.set_yticks(range(37), ['foo'] * 37, rotation_mode="ytick") + ax2.set_yticks(range(37), ['foo'] * 37, rotation_mode='ytick') + + angles = np.linspace(0, 360, 37) + for tick, angle in zip(ax.get_yticklabels(), angles): + tick.set_rotation(angle) + for tick, angle in zip(ax2.get_yticklabels(), angles): + tick.set_rotation(angle) + + plt.subplots_adjust(left=0.4, right=0.6, top=.99, bottom=.01) diff --git a/lib/matplotlib/text.py b/lib/matplotlib/text.py index 0b65450f760b..0b6a4811ea38 100644 --- a/lib/matplotlib/text.py +++ b/lib/matplotlib/text.py @@ -301,16 +301,19 @@ def set_rotation_mode(self, m): Parameters ---------- - m : {None, 'default', 'anchor'} + m : {None, 'default', 'anchor', 'xtick', 'ytick'} If ``"default"``, the text will be first rotated, then aligned according to their horizontal and vertical alignments. If ``"anchor"``, then - alignment occurs before rotation. Passing ``None`` will set the rotation - mode to ``"default"``. + alignment occurs before rotation. "xtick" and "ytick" adjust the + horizontal/vertical alignment so that the text is visually pointing + towards its anchor point. This is primarily used for rotated tick + labels and positions them nicely towards their ticks. Passing + ``None`` will set the rotation mode to ``"default"``. """ if m is None: m = "default" else: - _api.check_in_list(("anchor", "default"), rotation_mode=m) + _api.check_in_list(("anchor", "default", "xtick", "ytick"), rotation_mode=m) self._rotation_mode = m self.stale = True @@ -454,6 +457,11 @@ def _get_layout(self, renderer): rotation_mode = self.get_rotation_mode() if rotation_mode != "anchor": + angle = self.get_rotation() + if rotation_mode == 'xtick': + halign = self._ha_for_angle(angle) + elif rotation_mode == 'ytick': + valign = self._va_for_angle(angle) # compute the text location in display coords and the offsets # necessary to align the bbox with that location if halign == 'center': @@ -1380,6 +1388,32 @@ def set_fontname(self, fontname): """ self.set_fontfamily(fontname) + def _ha_for_angle(self, angle): + """ + Determines horizontal alignment ('ha') for rotation_mode "xtick" based on + the angle of rotation in degrees and the vertical alignment. + """ + anchor_at_bottom = self.get_verticalalignment() == 'bottom' + if (angle <= 10 or 85 <= angle <= 95 or 350 <= angle or + 170 <= angle <= 190 or 265 <= angle <= 275): + return 'center' + elif 10 < angle < 85 or 190 < angle < 265: + return 'left' if anchor_at_bottom else 'right' + return 'right' if anchor_at_bottom else 'left' + + def _va_for_angle(self, angle): + """ + Determines vertical alignment ('va') for rotation_mode "ytick" based on + the angle of rotation in degrees and the horizontal alignment. + """ + anchor_at_left = self.get_horizontalalignment() == 'left' + if (angle <= 10 or 350 <= angle or 170 <= angle <= 190 + or 80 <= angle <= 100 or 260 <= angle <= 280): + return 'center' + elif 190 < angle < 260 or 10 < angle < 80: + return 'baseline' if anchor_at_left else 'top' + return 'top' if anchor_at_left else 'baseline' + class OffsetFrom: """Callable helper class for working with `Annotation`.""" diff --git a/lib/matplotlib/text.pyi b/lib/matplotlib/text.pyi index d65a3dc4c7da..74b5d9904a1d 100644 --- a/lib/matplotlib/text.pyi +++ b/lib/matplotlib/text.pyi @@ -106,6 +106,8 @@ class Text(Artist): def set_fontname(self, fontname: str | Iterable[str]) -> None: ... def get_antialiased(self) -> bool: ... def set_antialiased(self, antialiased: bool) -> None: ... + def _ha_for_angle(self, angle: Any) -> Literal['center', 'right', 'left'] | None: ... + def _va_for_angle(self, angle: Any) -> Literal['center', 'top', 'baseline'] | None: ... class OffsetFrom: def __init__(