From 1561dcde84cbbfcc506990640fa5037d9194c83a Mon Sep 17 00:00:00 2001 From: Antony Lee Date: Mon, 30 Nov 2020 21:10:08 +0100 Subject: [PATCH 01/11] Switch AxisArtist to use standard tickdirs. i.e. defaulting to "out". Also support "inout". Would perpendicular work better for "out"? see e.g. demo_curvelinear_grid. --- lib/mpl_toolkits/axisartist/axis_artist.py | 58 ++++++++++++------- .../axisartist/tests/test_axis_artist.py | 3 +- .../axisartist/tests/test_axislines.py | 11 ++-- .../axisartist/tests/test_floating_axes.py | 6 +- .../tests/test_grid_helper_curvelinear.py | 9 ++- 5 files changed, 58 insertions(+), 29 deletions(-) diff --git a/lib/mpl_toolkits/axisartist/axis_artist.py b/lib/mpl_toolkits/axisartist/axis_artist.py index 08bb73b08e11..b675ef4115ad 100644 --- a/lib/mpl_toolkits/axisartist/axis_artist.py +++ b/lib/mpl_toolkits/axisartist/axis_artist.py @@ -62,7 +62,7 @@ The following attributes can be customized (use the ``set_xxx`` methods): -* `Ticks`: ticksize, tick_out +* `Ticks`: ticksize, tickdir * `TickLabels`: pad * `AxisLabel`: pad """ @@ -109,12 +109,12 @@ class Ticks(AttributeCopier, Line2D): Ticks are derived from `.Line2D`, and note that ticks themselves are markers. Thus, you should use set_mec, set_mew, etc. - To change the tick size (length), you need to use - `set_ticksize`. To change the direction of the ticks (ticks are - in opposite direction of ticklabels by default), use - ``set_tick_out(False)`` + To change the tick size (length), use set_ticksize. To change the + direction of the ticks, use set_tickdir ("out" corresponds to the side of + the label, "in" to the opposite side). """ + # tick_out is mostly deprecated in favor of tickdir. def __init__(self, ticksize, tick_out=False, *, axis=None, **kwargs): self._ticksize = ticksize self.locs_angles_labels = [] @@ -152,13 +152,24 @@ def get_markeredgecolor(self): def get_markeredgewidth(self): return self.get_attribute_from_ref_artist("markeredgewidth") + def set_tickdir(self, tickdir): + _api.check_in_list(self._tick_paths, tickdir=tickdir) + self._tickdir = tickdir + + def get_tickdir(self): + return self._tickdir + def set_tick_out(self, b): """Set whether ticks are drawn inside or outside the axes.""" - self._tick_out = b + self.set_tickdir({True: "out", False: "in"}[bool(b)]) def get_tick_out(self): """Return whether ticks are drawn inside or outside the axes.""" - return self._tick_out + if self._tickdir == "out": + return True + elif self._tickdir == "in": + return False + raise ValueError(f"tickdir is {self._tickdir}") def set_ticksize(self, ticksize): """Set length of the ticks in points.""" @@ -171,7 +182,11 @@ def get_ticksize(self): def set_locs_angles(self, locs_angles): self.locs_angles = locs_angles - _tickvert_path = Path([[0., 0.], [1., 0.]]) + _tick_paths = { + "out": Path([[0, 0], [-1, 0]]), + "in": Path([[0, 0], [1, 0]]), + "inout": Path([[-1/2, 0], [1/2, 0]]), + } def draw(self, renderer): if not self.get_visible(): @@ -185,15 +200,14 @@ def draw(self, renderer): path_trans = self.get_transform() marker_transform = (Affine2D() .scale(renderer.points_to_pixels(self._ticksize))) - if self.get_tick_out(): - marker_transform.rotate_deg(180) + tick_path = self._tick_paths[self._tickdir] for loc, angle in self.locs_angles: locs = path_trans.transform_non_affine(np.array([loc])) if self.axes and not self.axes.viewLim.contains(*locs[0]): continue renderer.draw_markers( - gc, self._tickvert_path, + gc, tick_path, marker_transform + Affine2D().rotate_deg(angle), Path(locs), path_trans.get_affine()) @@ -868,12 +882,14 @@ def _init_ticks(self, **kwargs): kwargs.get( "major_tick_size", mpl.rcParams[f"{axis_name}tick.major.size"]), - axis=self.axis, transform=trans) + axis=self.axis, transform=trans, + tickdir=mpl.rcParams[f"{axis_name}tick.direction"]) self.minor_ticks = Ticks( kwargs.get( "minor_tick_size", mpl.rcParams[f"{axis_name}tick.minor.size"]), - axis=self.axis, transform=trans) + axis=self.axis, transform=trans, + tickdir=mpl.rcParams[f"{axis_name}tick.direction"]) size = mpl.rcParams[f"{axis_name}tick.labelsize"] self.major_ticklabels = TickLabels( @@ -925,13 +941,13 @@ def _update_ticks(self, renderer=None): renderer = self.figure._get_renderer() dpi_cor = renderer.points_to_pixels(1.) - if self.major_ticks.get_visible() and self.major_ticks.get_tick_out(): - ticklabel_pad = self.major_ticks._ticksize * dpi_cor - self.major_ticklabels._external_pad = ticklabel_pad - self.minor_ticklabels._external_pad = ticklabel_pad - else: - self.major_ticklabels._external_pad = 0 - self.minor_ticklabels._external_pad = 0 + multiplier = ( + self.major_ticks.get_visible() + * {"out": 1, "inout": .5, "in": 0}[self.major_ticks._tickdir]) + self.major_ticklabels._set_external_pad( + multiplier * self.major_ticks._ticksize * dpi_cor) + self.minor_ticklabels._set_external_pad( + multiplier * self.major_ticks._ticksize * dpi_cor) majortick_iter, minortick_iter = \ self._axis_artist_helper.get_tick_iterators(self.axes) @@ -1006,7 +1022,7 @@ def _update_label(self, renderer): return if self._ticklabel_add_angle != self._axislabel_add_angle: - if ((self.major_ticks.get_visible() + if ((self.major_ticks.get_visible() # ??? and not self.major_ticks.get_tick_out()) or (self.minor_ticks.get_visible() and not self.major_ticks.get_tick_out())): diff --git a/lib/mpl_toolkits/axisartist/tests/test_axis_artist.py b/lib/mpl_toolkits/axisartist/tests/test_axis_artist.py index 391fd116ea86..c2f201dfd032 100644 --- a/lib/mpl_toolkits/axisartist/tests/test_axis_artist.py +++ b/lib/mpl_toolkits/axisartist/tests/test_axis_artist.py @@ -78,8 +78,9 @@ def test_ticklabels(): @image_comparison(['axis_artist.png'], style='default') def test_axis_artist(): - # Remove this line when this test image is regenerated. + # Remove these lines when this test image is regenerated. plt.rcParams['text.kerning_factor'] = 6 + plt.rcParams.update({"xtick.direction": "in", "ytick.direction": "in"}) fig, ax = plt.subplots() diff --git a/lib/mpl_toolkits/axisartist/tests/test_axislines.py b/lib/mpl_toolkits/axisartist/tests/test_axislines.py index 7743cb35aa3b..005a8d52604d 100644 --- a/lib/mpl_toolkits/axisartist/tests/test_axislines.py +++ b/lib/mpl_toolkits/axisartist/tests/test_axislines.py @@ -9,8 +9,9 @@ @image_comparison(['SubplotZero.png'], style='default') def test_SubplotZero(): - # Remove this line when this test image is regenerated. + # Remove these lines when this test image is regenerated. plt.rcParams['text.kerning_factor'] = 6 + plt.rcParams.update({"xtick.direction": "in", "ytick.direction": "in"}) fig = plt.figure() @@ -30,8 +31,9 @@ def test_SubplotZero(): @image_comparison(['Subplot.png'], style='default') def test_Subplot(): - # Remove this line when this test image is regenerated. + # Remove these lines when this test image is regenerated. plt.rcParams['text.kerning_factor'] = 6 + plt.rcParams.update({"xtick.direction": "in", "ytick.direction": "in"}) fig = plt.figure() @@ -59,9 +61,10 @@ def test_Axes(): @image_comparison(['ParasiteAxesAuxTrans_meshplot.png'], remove_text=True, style='default', tol=0.075) -def test_ParasiteAxesAuxTrans(): - # Remove this line when this test image is regenerated. +def test_ParasiteAxesAuxTrans(parasite_cls): + # Remove these lines when this test image is regenerated. plt.rcParams['pcolormesh.snap'] = False + plt.rcParams.update({"xtick.direction": "in", "ytick.direction": "in"}) data = np.ones((6, 6)) data[2, 2] = 2 diff --git a/lib/mpl_toolkits/axisartist/tests/test_floating_axes.py b/lib/mpl_toolkits/axisartist/tests/test_floating_axes.py index d489f492d4d3..000acf5a30d0 100644 --- a/lib/mpl_toolkits/axisartist/tests/test_floating_axes.py +++ b/lib/mpl_toolkits/axisartist/tests/test_floating_axes.py @@ -21,6 +21,9 @@ def test_subplot(): # remove when image is regenerated. @image_comparison(['curvelinear3.png'], style='default', tol=5) def test_curvelinear3(): + # Remove this lines when this test image is regenerated. + plt.rcParams.update({"xtick.direction": "in", "ytick.direction": "in"}) + fig = plt.figure(figsize=(5, 5)) tr = (mtransforms.Affine2D().scale(np.pi / 180, 1) + @@ -67,8 +70,9 @@ def test_curvelinear3(): # remove when image is regenerated. @image_comparison(['curvelinear4.png'], style='default', tol=0.9) def test_curvelinear4(): - # Remove this line when this test image is regenerated. + # Remove these lines when this test image is regenerated. plt.rcParams['text.kerning_factor'] = 6 + plt.rcParams.update({"xtick.direction": "in", "ytick.direction": "in"}) fig = plt.figure(figsize=(5, 5)) diff --git a/lib/mpl_toolkits/axisartist/tests/test_grid_helper_curvelinear.py b/lib/mpl_toolkits/axisartist/tests/test_grid_helper_curvelinear.py index ffc5f6c1b791..42a64c0db91a 100644 --- a/lib/mpl_toolkits/axisartist/tests/test_grid_helper_curvelinear.py +++ b/lib/mpl_toolkits/axisartist/tests/test_grid_helper_curvelinear.py @@ -16,6 +16,9 @@ @image_comparison(['custom_transform.png'], style='default', tol=0.2) def test_custom_transform(): + # Remove this line when this test image is regenerated. + plt.rcParams.update({"xtick.direction": "in", "ytick.direction": "in"}) + class MyTransform(Transform): input_dims = output_dims = 2 @@ -77,8 +80,9 @@ def inverted(self): @image_comparison(['polar_box.png'], style='default', tol=0.04) def test_polar_box(): - # Remove this line when this test image is regenerated. + # Remove these lines when this test image is regenerated. plt.rcParams['text.kerning_factor'] = 6 + plt.rcParams.update({"xtick.direction": "in", "ytick.direction": "in"}) fig = plt.figure(figsize=(5, 5)) @@ -139,8 +143,9 @@ def test_polar_box(): @image_comparison(['axis_direction.png'], style='default', tol=0.071) def test_axis_direction(): - # Remove this line when this test image is regenerated. + # Remove these lines when this test image is regenerated. plt.rcParams['text.kerning_factor'] = 6 + plt.rcParams.update({"xtick.direction": "in", "ytick.direction": "in"}) fig = plt.figure(figsize=(5, 5)) From e5790aa3bcc150bd72ec1bb9d0c8fb5d10400861 Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Wed, 16 Nov 2022 21:43:02 +0900 Subject: [PATCH 02/11] remove the use of _set_external_pad in axisartist --- lib/mpl_toolkits/axisartist/axis_artist.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/mpl_toolkits/axisartist/axis_artist.py b/lib/mpl_toolkits/axisartist/axis_artist.py index b675ef4115ad..be36693163aa 100644 --- a/lib/mpl_toolkits/axisartist/axis_artist.py +++ b/lib/mpl_toolkits/axisartist/axis_artist.py @@ -944,10 +944,10 @@ def _update_ticks(self, renderer=None): multiplier = ( self.major_ticks.get_visible() * {"out": 1, "inout": .5, "in": 0}[self.major_ticks._tickdir]) - self.major_ticklabels._set_external_pad( - multiplier * self.major_ticks._ticksize * dpi_cor) - self.minor_ticklabels._set_external_pad( - multiplier * self.major_ticks._ticksize * dpi_cor) + self.major_ticklabels._external_pad = \ + multiplier * self.major_ticks._ticksize * dpi_cor + self.minor_ticklabels._external_pad = \ + multiplier * self.major_ticks._ticksize * dpi_cor majortick_iter, minortick_iter = \ self._axis_artist_helper.get_tick_iterators(self.axes) From f4ba9afc75d868184d32cfe54976d2575bb56693 Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Sun, 20 Nov 2022 22:02:13 +0900 Subject: [PATCH 03/11] support axislabel_pad for tickdir==inout --- lib/mpl_toolkits/axisartist/axis_artist.py | 26 ++++++++++++++++------ 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/lib/mpl_toolkits/axisartist/axis_artist.py b/lib/mpl_toolkits/axisartist/axis_artist.py index be36693163aa..bebd2a57b794 100644 --- a/lib/mpl_toolkits/axisartist/axis_artist.py +++ b/lib/mpl_toolkits/axisartist/axis_artist.py @@ -1021,15 +1021,27 @@ def _update_label(self, renderer): if not self.label.get_visible(): return + # We calculate the pad size for the axislabel. if self._ticklabel_add_angle != self._axislabel_add_angle: - if ((self.major_ticks.get_visible() # ??? - and not self.major_ticks.get_tick_out()) - or (self.minor_ticks.get_visible() - and not self.major_ticks.get_tick_out())): - axislabel_pad = self.major_ticks._ticksize - else: - axislabel_pad = 0 + # If ticklabels and axislabel are on differenct side, we only + # conside the padding for the ticks only. + + ticksizes = [] + # ticksize of the major_ticks + ticksizes.append( + self.major_ticks.get_visible() + * {"out": 1, "inout": .5, "in": 0}[self.major_ticks._tickdir] + * self.major_ticks._ticksize + ) + ticksizes.append( + self.minor_ticks.get_visible() + * {"out": 1, "inout": .5, "in": 0}[self.minor_ticks._tickdir] + * self.minor_ticks._ticksize + ) + axislabel_pad = max(ticksizes) else: + # If ticklabels and axislabel are on the same side, we use values + # from the the ticklabels. axislabel_pad = max(self.major_ticklabels._axislabel_pad, self.minor_ticklabels._axislabel_pad) From 0b6fcba0c1b7102edfe4256338ffda42ff420c9c Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Sun, 20 Nov 2022 23:16:42 +0900 Subject: [PATCH 04/11] add tick_orientation --- lib/mpl_toolkits/axisartist/axis_artist.py | 65 +++++++++++++++++-- .../axisartist/grid_helper_curvelinear.py | 4 ++ 2 files changed, 62 insertions(+), 7 deletions(-) diff --git a/lib/mpl_toolkits/axisartist/axis_artist.py b/lib/mpl_toolkits/axisartist/axis_artist.py index bebd2a57b794..4fa6d6b82c5f 100644 --- a/lib/mpl_toolkits/axisartist/axis_artist.py +++ b/lib/mpl_toolkits/axisartist/axis_artist.py @@ -115,11 +115,13 @@ class Ticks(AttributeCopier, Line2D): """ # tick_out is mostly deprecated in favor of tickdir. - def __init__(self, ticksize, tick_out=False, *, axis=None, **kwargs): + def __init__(self, ticksize, tick_out=False, tick_orientation="auto", + *, axis=None, **kwargs): self._ticksize = ticksize self.locs_angles_labels = [] self.set_tick_out(tick_out) + self.set_tick_orientation(tick_orientation) self._axis = axis if self._axis is not None: @@ -159,6 +161,41 @@ def set_tickdir(self, tickdir): def get_tickdir(self): return self._tickdir + def set_tick_orientation(self, mode): + """Set how tick orientation will be determined. + + Parameters + ---------- + mode : {"parallel", "normal", "auto"} + 'parallel' - ticks along the grid lines + 'normal' - ticks normal to axis line. + 'auto' - 'normal' if tickdir is 'out' else 'parallel' + """ + _api.check_in_list(["auto", "normal", "parallel"], + tick_orientation=mode) + self._tick_orientation = mode + + def get_tick_orientation(self, interpret_auto=True): + """ Return orientation of ticks. + + Parameters + ---------- + interpret_auto : bool, default if True + If True and tick_orientation is 'auto', return the + interpreted value ('normal' if dicktir is out, else 'parallel). + If False, return 'auto' as 'auto'. + + Returns + ------- + tick_orientation : {"parallel", "normal", "auto"} + """ + tick_orientation = self._tick_orientation + if tick_orientation == "auto" and interpret_auto: + tick_orientation = ("normal" if self._tickdir == "out" + else "parallel") + + return tick_orientation + def set_tick_out(self, b): """Set whether ticks are drawn inside or outside the axes.""" self.set_tickdir({True: "out", False: "in"}[bool(b)]) @@ -911,7 +948,7 @@ def _init_ticks(self, **kwargs): "minor_tick_pad", mpl.rcParams[f"{axis_name}tick.minor.pad"]), ) - def _get_tick_info(self, tick_iter): + def _get_tick_info(self, tick_iter, tick_orientation="parallel"): """ Return a pair of: @@ -925,9 +962,16 @@ def _get_tick_info(self, tick_iter): for loc, angle_normal, angle_tangent, label in tick_iter: angle_label = angle_tangent - 90 + ticklabel_add_angle - angle_tick = (angle_normal - if 90 <= (angle_label - angle_normal) % 360 <= 270 - else angle_normal + 180) + if tick_orientation == "parallel": # tick along the gridlines + angle_tick = ( + angle_normal + if 90 <= (angle_label - angle_normal) % 360 <= 270 + else angle_normal + 180) + elif tick_orientation == "normal": # tick normal to axisline. + angle_tick = 180+angle_label + else: + raise ValueError( + f"Unsupported tick_orientation of {tick_orientation}") ticks_loc_angle.append([loc, angle_tick]) ticklabels_loc_angle_label.append([loc, angle_label, label]) @@ -944,6 +988,7 @@ def _update_ticks(self, renderer=None): multiplier = ( self.major_ticks.get_visible() * {"out": 1, "inout": .5, "in": 0}[self.major_ticks._tickdir]) + self.major_ticklabels._external_pad = \ multiplier * self.major_ticks._ticksize * dpi_cor self.minor_ticklabels._external_pad = \ @@ -952,13 +997,19 @@ def _update_ticks(self, renderer=None): majortick_iter, minortick_iter = \ self._axis_artist_helper.get_tick_iterators(self.axes) + tick_orientation = self.major_ticks.get_tick_orientation( + interpret_auto=True) tick_loc_angle, ticklabel_loc_angle_label = \ - self._get_tick_info(majortick_iter) + self._get_tick_info(majortick_iter, tick_orientation) + self.major_ticks.set_locs_angles(tick_loc_angle) self.major_ticklabels.set_locs_angles_labels(ticklabel_loc_angle_label) + tick_orientation = self.minor_ticks.get_tick_orientation( + interpret_auto=True) tick_loc_angle, ticklabel_loc_angle_label = \ - self._get_tick_info(minortick_iter) + self._get_tick_info(minortick_iter, tick_orientation) + self.minor_ticks.set_locs_angles(tick_loc_angle) self.minor_ticklabels.set_locs_angles_labels(ticklabel_loc_angle_label) diff --git a/lib/mpl_toolkits/axisartist/grid_helper_curvelinear.py b/lib/mpl_toolkits/axisartist/grid_helper_curvelinear.py index 3e4ae747e853..53b8688fbab0 100644 --- a/lib/mpl_toolkits/axisartist/grid_helper_curvelinear.py +++ b/lib/mpl_toolkits/axisartist/grid_helper_curvelinear.py @@ -313,6 +313,10 @@ def new_floating_axis(self, nth_coord, # axisline.major_ticklabels.set_visible(True) # axisline.minor_ticklabels.set_visible(False) + # For floating axis, we force the tick_orientation of "parallel". + axisline.major_ticks.set_tick_orientation("parallel") + axisline.minor_ticks.set_tick_orientation("parallel") + return axisline def _update_grid(self, x1, y1, x2, y2): From 5f5728d56657dc25f859e749833c5e63ea482b24 Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Sat, 26 Nov 2022 23:07:17 +0900 Subject: [PATCH 05/11] remove unused parasite_cls argument in test_axislines.py --- lib/mpl_toolkits/axisartist/tests/test_axislines.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/mpl_toolkits/axisartist/tests/test_axislines.py b/lib/mpl_toolkits/axisartist/tests/test_axislines.py index 005a8d52604d..616c76fe0226 100644 --- a/lib/mpl_toolkits/axisartist/tests/test_axislines.py +++ b/lib/mpl_toolkits/axisartist/tests/test_axislines.py @@ -61,7 +61,7 @@ def test_Axes(): @image_comparison(['ParasiteAxesAuxTrans_meshplot.png'], remove_text=True, style='default', tol=0.075) -def test_ParasiteAxesAuxTrans(parasite_cls): +def test_ParasiteAxesAuxTrans(): # Remove these lines when this test image is regenerated. plt.rcParams['pcolormesh.snap'] = False plt.rcParams.update({"xtick.direction": "in", "ytick.direction": "in"}) From 8f2dae566ba7641213e0d95f91737c79be8c54e2 Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Sun, 27 Nov 2022 17:01:32 +0900 Subject: [PATCH 06/11] flake8 fix --- lib/mpl_toolkits/axisartist/axis_artist.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/mpl_toolkits/axisartist/axis_artist.py b/lib/mpl_toolkits/axisartist/axis_artist.py index 4fa6d6b82c5f..bc2e0982a0e1 100644 --- a/lib/mpl_toolkits/axisartist/axis_artist.py +++ b/lib/mpl_toolkits/axisartist/axis_artist.py @@ -162,7 +162,8 @@ def get_tickdir(self): return self._tickdir def set_tick_orientation(self, mode): - """Set how tick orientation will be determined. + """ + Set how tick orientation will be determined. Parameters ---------- @@ -176,7 +177,8 @@ def set_tick_orientation(self, mode): self._tick_orientation = mode def get_tick_orientation(self, interpret_auto=True): - """ Return orientation of ticks. + """ + Return orientation of ticks. Parameters ---------- From bf39e0ae83bf3f3b5571b285e4821f94767d1c1a Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Mon, 28 Nov 2022 11:17:26 +0900 Subject: [PATCH 07/11] Deprecate tick_out and add tests for warnings. --- lib/mpl_toolkits/axisartist/axis_artist.py | 29 +++++++++++++++---- .../axisartist/tests/test_axis_artist.py | 28 ++++++++++++++++-- 2 files changed, 49 insertions(+), 8 deletions(-) diff --git a/lib/mpl_toolkits/axisartist/axis_artist.py b/lib/mpl_toolkits/axisartist/axis_artist.py index bc2e0982a0e1..ef9a4fe72fdd 100644 --- a/lib/mpl_toolkits/axisartist/axis_artist.py +++ b/lib/mpl_toolkits/axisartist/axis_artist.py @@ -72,6 +72,7 @@ from operator import methodcaller +import warnings import numpy as np @@ -115,12 +116,30 @@ class Ticks(AttributeCopier, Line2D): """ # tick_out is mostly deprecated in favor of tickdir. - def __init__(self, ticksize, tick_out=False, tick_orientation="auto", - *, axis=None, **kwargs): + + @_api.delete_parameter("3.7", "tick_out", alternative="tickdir") + def __init__(self, ticksize, tick_out=None, + *, tick_orientation="auto", + axis=None, **kwargs): self._ticksize = ticksize self.locs_angles_labels = [] - self.set_tick_out(tick_out) + if "tickdir" in kwargs: + if tick_out is not None: + raise ValueError("tickdir and tick_out" + "cannot be used together") + self.set_tickdir(kwargs.pop("tickdir")) + else: + # The default value for tick_out was False. We changed it to None + # to catch whether it explicily set by the user. "None" may not be + # a good choice of value though. + if tick_out is None: + warnings.warn("The dwfault behavior will change. " + "Explicitly set tickdir parameter if you want.") + tick_out = False + + self.set_tickdir({True: "out", False: "in"}[bool(tick_out)]) + self.set_tick_orientation(tick_orientation) self._axis = axis @@ -1076,8 +1095,8 @@ def _update_label(self, renderer): # We calculate the pad size for the axislabel. if self._ticklabel_add_angle != self._axislabel_add_angle: - # If ticklabels and axislabel are on differenct side, we only - # conside the padding for the ticks only. + # If ticklabels and axislabel are on different side, we only + # consider the padding for the ticks only. ticksizes = [] # ticksize of the major_ticks diff --git a/lib/mpl_toolkits/axisartist/tests/test_axis_artist.py b/lib/mpl_toolkits/axisartist/tests/test_axis_artist.py index c2f201dfd032..04d7c24dfdf4 100644 --- a/lib/mpl_toolkits/axisartist/tests/test_axis_artist.py +++ b/lib/mpl_toolkits/axisartist/tests/test_axis_artist.py @@ -5,6 +5,8 @@ from mpl_toolkits.axisartist.axis_artist import (AxisArtist, AxisLabel, LabelBase, Ticks, TickLabels) +from matplotlib._api.deprecation import MatplotlibDeprecationWarning + @image_comparison(['axis_artist_ticks.png'], style='default') def test_ticks(): @@ -15,11 +17,11 @@ def test_ticks(): locs_angles = [((i / 10, 0.0), i * 30) for i in range(-1, 12)] - ticks_in = Ticks(ticksize=10, axis=ax.xaxis) + ticks_in = Ticks(ticksize=10, tickdir="in", axis=ax.xaxis) ticks_in.set_locs_angles(locs_angles) ax.add_artist(ticks_in) - ticks_out = Ticks(ticksize=10, tick_out=True, color='C3', axis=ax.xaxis) + ticks_out = Ticks(ticksize=10, tickdir="out", color='C3', axis=ax.xaxis) ticks_out.set_locs_angles(locs_angles) ax.add_artist(ticks_out) @@ -53,7 +55,7 @@ def test_ticklabels(): ax.plot([0.2, 0.4], [0.5, 0.5], "o") - ticks = Ticks(ticksize=10, axis=ax.xaxis) + ticks = Ticks(ticksize=10, tickdir="in", axis=ax.xaxis) ax.add_artist(ticks) locs_angles_labels = [((0.2, 0.5), -90, "0.2"), ((0.4, 0.5), -120, "0.4")] @@ -98,3 +100,23 @@ def test_axis_artist(): axisline.label.set_pad(5) ax.set_ylabel("Test") + + +def test_tickout_kwargs(recwarn): + """ + test that 'singular' versions of LineCollection props raise an + MatplotlibDeprecationWarning rather than overriding the 'plural' versions + (e.g., to prevent 'color' from overriding 'colors', see issue #4297) + """ + + Ticks(1) + Ticks(1, False) + Ticks(1, False) + Ticks(1, tick_out=True) + Ticks(1, tick_out=False) + + assert issubclass(recwarn[0].category, UserWarning) + # May need to check the message + + assert all(issubclass(wi.category, MatplotlibDeprecationWarning) + for wi in recwarn[1:]) From 95b9e48190618779ff25706210fcbda2802da551 Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Thu, 8 Dec 2022 10:21:42 +0900 Subject: [PATCH 08/11] fix axislabel padding. --- lib/mpl_toolkits/axisartist/axis_artist.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/mpl_toolkits/axisartist/axis_artist.py b/lib/mpl_toolkits/axisartist/axis_artist.py index ef9a4fe72fdd..79168e02fca2 100644 --- a/lib/mpl_toolkits/axisartist/axis_artist.py +++ b/lib/mpl_toolkits/axisartist/axis_artist.py @@ -1098,16 +1098,19 @@ def _update_label(self, renderer): # If ticklabels and axislabel are on different side, we only # consider the padding for the ticks only. + # "in", "out" and "inout" are relative to the ticks. Therefore, "in" + # means that axislabel and ticks are on the same side while + # ticklabels are on the other side. ticksizes = [] # ticksize of the major_ticks ticksizes.append( self.major_ticks.get_visible() - * {"out": 1, "inout": .5, "in": 0}[self.major_ticks._tickdir] + * {"out": 0, "inout": .5, "in": 1}[self.major_ticks._tickdir] * self.major_ticks._ticksize ) ticksizes.append( self.minor_ticks.get_visible() - * {"out": 1, "inout": .5, "in": 0}[self.minor_ticks._tickdir] + * {"out": 0, "inout": .5, "in": 1}[self.minor_ticks._tickdir] * self.minor_ticks._ticksize ) axislabel_pad = max(ticksizes) From d940fb983900b16c36bd8da1786e355a28bbd137 Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Thu, 8 Dec 2022 10:22:25 +0900 Subject: [PATCH 09/11] add axis_artist_dir test --- .../test_axis_artist/axis_artist_dir.png | Bin 0 -> 11404 bytes .../axisartist/tests/test_axis_artist.py | 38 ++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 lib/mpl_toolkits/axisartist/tests/baseline_images/test_axis_artist/axis_artist_dir.png diff --git a/lib/mpl_toolkits/axisartist/tests/baseline_images/test_axis_artist/axis_artist_dir.png b/lib/mpl_toolkits/axisartist/tests/baseline_images/test_axis_artist/axis_artist_dir.png new file mode 100644 index 0000000000000000000000000000000000000000..34b2f1fbe3ba03d1f3c40949a086a8f90e1cdc7b GIT binary patch literal 11404 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 literal 0 HcmV?d00001 diff --git a/lib/mpl_toolkits/axisartist/tests/test_axis_artist.py b/lib/mpl_toolkits/axisartist/tests/test_axis_artist.py index 04d7c24dfdf4..9cbbee51c8d2 100644 --- a/lib/mpl_toolkits/axisartist/tests/test_axis_artist.py +++ b/lib/mpl_toolkits/axisartist/tests/test_axis_artist.py @@ -1,6 +1,7 @@ import matplotlib.pyplot as plt from matplotlib.testing.decorators import image_comparison +from mpl_toolkits import axisartist from mpl_toolkits.axisartist import AxisArtistHelperRectlinear from mpl_toolkits.axisartist.axis_artist import (AxisArtist, AxisLabel, LabelBase, Ticks, TickLabels) @@ -120,3 +121,40 @@ def test_tickout_kwargs(recwarn): assert all(issubclass(wi.category, MatplotlibDeprecationWarning) for wi in recwarn[1:]) + + +def _setup_axes_for_axis_artist_dir(fig, pos): + ax = fig.add_subplot(pos, axes_class=axisartist.Axes) + + ax.set_ylim(-0.1, 1.5) + ax.set_yticks([0, 1]) + + ax.axis[:].set_visible(False) + + ax.axis["x"] = ax.new_floating_axis(1, 0.5) + + return ax + + +@image_comparison(['axis_artist_dir.png'], style='default') +def test_axis_artist_dir(): + plt.rcParams['text.kerning_factor'] = 6 + + fig = plt.figure(figsize=(4, 5), num=1) + fig.clf() + + from matplotlib.gridspec import GridSpec + gs = GridSpec(3, 4, figure=fig) + gsi = iter(gs) + + for td in ["in", "out", "inout"]: + for ld in "+-": + for tld in "+-": + ax = _setup_axes_for_axis_artist_dir(fig, next(gsi)) + axis = ax.axis["x"] + axis.major_ticks.set_ticksize(8) + axis.label.set_text("Label") + axis.toggle(ticklabels=True) + axis.set_axislabel_direction(ld) + axis.set_ticklabel_direction(tld) + axis.major_ticks.set_tickdir(td) From d52056bc2939cf3518739e198542517c5a415a26 Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Thu, 8 Dec 2022 11:46:57 +0900 Subject: [PATCH 10/11] add test for tick_orientation. --- .../axis_artist_tick_orientation.png | Bin 0 -> 27274 bytes .../axisartist/tests/test_axis_artist.py | 46 +++++++++++++++++- 2 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 lib/mpl_toolkits/axisartist/tests/baseline_images/test_axis_artist/axis_artist_tick_orientation.png diff --git a/lib/mpl_toolkits/axisartist/tests/baseline_images/test_axis_artist/axis_artist_tick_orientation.png b/lib/mpl_toolkits/axisartist/tests/baseline_images/test_axis_artist/axis_artist_tick_orientation.png new file mode 100644 index 0000000000000000000000000000000000000000..60643bf08ce458b131e97e8b25aff80efbf97edf GIT binary patch literal 27274 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 R#6AtkCNE9_~a4^=?_PF3<43$7Gb%A{@yJX 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 Date: Thu, 8 Dec 2022 11:55:18 +0900 Subject: [PATCH 11/11] minor doc update --- lib/mpl_toolkits/axisartist/axis_artist.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/lib/mpl_toolkits/axisartist/axis_artist.py b/lib/mpl_toolkits/axisartist/axis_artist.py index 79168e02fca2..8219b78c6a88 100644 --- a/lib/mpl_toolkits/axisartist/axis_artist.py +++ b/lib/mpl_toolkits/axisartist/axis_artist.py @@ -55,10 +55,16 @@ axislabel ha right center right center =================== ====== ======== ====== ======== -Ticks are by default direct opposite side of the ticklabels. To make ticks to -the same side of the ticklabels, :: +Direction of ticks follows the setting in rcParams (default is "out"). To +change it, :: - ax.axis["bottom"].major_ticks.set_tick_out(True) + ax.axis["bottom"].major_ticks.set_tickdir("in") + +Ticks can be oriented either normal to the axisline or parallel to the grid +lines. The default is "normal" if "tickdir" is "out", "parallel" otherwise. +To change it, :: + + ax.axis["bottom"].major_ticks.set_tick_orientation("normal") The following attributes can be customized (use the ``set_xxx`` methods):