Skip to content

Commit 11737d0

Browse files
authored
Merge pull request #21425 from anntzer/a3
MNT: Make Axis3D constructor signature closer to the one of 2D axis.
2 parents 6310073 + 004de34 commit 11737d0

File tree

3 files changed

+74
-38
lines changed

3 files changed

+74
-38
lines changed
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
3D Axis
2+
~~~~~~~
3+
The previous constructor of `.axis3d.Axis`, with signature
4+
``(self, adir, v_intervalx, d_intervalx, axes, *args, rotate_label=None, **kwargs)``
5+
is deprecated in favor of a new signature closer to the one of 2D Axis; it
6+
is now ``(self, axes, *, rotate_label=None, **kwargs)`` where ``kwargs`` are
7+
forwarded to the 2D Axis constructor. The axis direction is now inferred from
8+
the axis class' ``axis_name`` attribute (as in the 2D case); the ``adir``
9+
attribute is deprecated.
10+
11+
The ``init3d`` method of 3D Axis is also deprecated; all the relevant
12+
initialization is done as part of the constructor.
13+
14+
The ``d_interval`` and ``v_interval`` attributes of 3D Axis are deprecated; use
15+
``get_data_interval`` and ``get_view_interval`` instead.

lib/mpl_toolkits/mplot3d/axes3d.py

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -215,14 +215,9 @@ def set_top_view(self):
215215

216216
def _init_axis(self):
217217
"""Init 3D axes; overrides creation of regular X/Y axes."""
218-
self.xaxis = axis3d.XAxis('x', self.xy_viewLim.intervalx,
219-
self.xy_dataLim.intervalx, self)
220-
self.yaxis = axis3d.YAxis('y', self.xy_viewLim.intervaly,
221-
self.xy_dataLim.intervaly, self)
222-
self.zaxis = axis3d.ZAxis('z', self.zz_viewLim.intervalx,
223-
self.zz_dataLim.intervalx, self)
224-
for ax in self.xaxis, self.yaxis, self.zaxis:
225-
ax.init3d()
218+
self.xaxis = axis3d.XAxis(self)
219+
self.yaxis = axis3d.YAxis(self)
220+
self.zaxis = axis3d.ZAxis(self)
226221

227222
def get_zaxis(self):
228223
"""Return the ``ZAxis`` (`~.axis3d.Axis`) instance."""

lib/mpl_toolkits/mplot3d/axis3d.py

Lines changed: 56 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@
22
# Created: 23 Sep 2005
33
# Parts rewritten by Reinier Heeres <reinier@heeres.eu>
44

5+
import inspect
6+
57
import numpy as np
68

7-
import matplotlib.transforms as mtransforms
89
from matplotlib import (
9-
artist, lines as mlines, axis as maxis, patches as mpatches, rcParams)
10+
_api, artist, lines as mlines, axis as maxis, patches as mpatches,
11+
transforms as mtransforms, rcParams)
1012
from . import art3d, proj3d
1113

1214

@@ -51,14 +53,34 @@ class Axis(maxis.XAxis):
5153
'color': (0.925, 0.925, 0.925, 0.5)},
5254
}
5355

54-
def __init__(self, adir, v_intervalx, d_intervalx, axes, *args,
55-
rotate_label=None, **kwargs):
56-
# adir identifies which axes this is
57-
self.adir = adir
56+
def _old_init(self, adir, v_intervalx, d_intervalx, axes, *args,
57+
rotate_label=None, **kwargs):
58+
return locals()
59+
60+
def _new_init(self, axes, *, rotate_label=None, **kwargs):
61+
return locals()
62+
63+
def __init__(self, *args, **kwargs):
64+
params = _api.select_matching_signature(
65+
[self._old_init, self._new_init], *args, **kwargs)
66+
if "adir" in params:
67+
_api.warn_deprecated(
68+
"3.6", message=f"The signature of 3D Axis constructors has "
69+
f"changed in %(since)s; the new signature is "
70+
f"{inspect.signature(type(self).__init__)}", pending=True)
71+
if params["adir"] != self.axis_name:
72+
raise ValueError(f"Cannot instantiate {type(self).__name__} "
73+
f"with adir={params['adir']!r}")
74+
axes = params["axes"]
75+
rotate_label = params["rotate_label"]
76+
args = params.get("args", ())
77+
kwargs = params["kwargs"]
78+
79+
name = self.axis_name
5880

5981
# This is a temporary member variable.
6082
# Do not depend on this existing in future releases!
61-
self._axinfo = self._AXINFO[adir].copy()
83+
self._axinfo = self._AXINFO[name].copy()
6284
if rcParams['_internal.classic_mode']:
6385
self._axinfo.update({
6486
'label': {'va': 'center', 'ha': 'center'},
@@ -85,10 +107,10 @@ def __init__(self, adir, v_intervalx, d_intervalx, axes, *args,
85107
'outward_factor': 0.1,
86108
'linewidth': {
87109
True: ( # major
88-
rcParams['xtick.major.width'] if adir in 'xz' else
110+
rcParams['xtick.major.width'] if name in 'xz' else
89111
rcParams['ytick.major.width']),
90112
False: ( # minor
91-
rcParams['xtick.minor.width'] if adir in 'xz' else
113+
rcParams['xtick.minor.width'] if name in 'xz' else
92114
rcParams['ytick.minor.width']),
93115
}
94116
},
@@ -106,11 +128,18 @@ def __init__(self, adir, v_intervalx, d_intervalx, axes, *args,
106128
super().__init__(axes, *args, **kwargs)
107129

108130
# data and viewing intervals for this direction
109-
self.d_interval = d_intervalx
110-
self.v_interval = v_intervalx
131+
if "d_intervalx" in params:
132+
self.set_data_interval(*params["d_intervalx"])
133+
if "v_intervalx" in params:
134+
self.set_view_interval(*params["v_intervalx"])
111135
self.set_rotate_label(rotate_label)
136+
self._init3d() # Inline after init3d deprecation elapses.
137+
138+
__init__.__signature__ = inspect.signature(_new_init)
139+
adir = _api.deprecated("3.6", pending=True)(
140+
property(lambda self: self.axis_name))
112141

113-
def init3d(self):
142+
def _init3d(self):
114143
self.line = mlines.Line2D(
115144
xdata=(0, 0), ydata=(0, 0),
116145
linewidth=self._axinfo['axisline']['linewidth'],
@@ -133,6 +162,10 @@ def init3d(self):
133162
self.label._transform = self.axes.transData
134163
self.offsetText._transform = self.axes.transData
135164

165+
@_api.deprecated("3.6", pending=True)
166+
def init3d(self): # After deprecation elapses, inline _init3d to __init__.
167+
self._init3d()
168+
136169
def get_major_ticks(self, numticks=None):
137170
ticks = super().get_major_ticks(numticks)
138171
for t in ticks:
@@ -496,41 +529,34 @@ def get_tightbbox(self, renderer, *, for_layout_only=False):
496529

497530
return mtransforms.Bbox.union([*bb_1, *bb_2, *other])
498531

499-
@property
500-
def d_interval(self):
501-
return self.get_data_interval()
502-
503-
@d_interval.setter
504-
def d_interval(self, minmax):
505-
self.set_data_interval(*minmax)
506-
507-
@property
508-
def v_interval(self):
509-
return self.get_view_interval()
510-
511-
@v_interval.setter
512-
def v_interval(self, minmax):
513-
self.set_view_interval(*minmax)
514-
515-
516-
# Use classes to look at different data limits
532+
d_interval = _api.deprecated(
533+
"3.6", alternative="get_data_interval", pending=True)(
534+
property(lambda self: self.get_data_interval(),
535+
lambda self, minmax: self.set_data_interval(*minmax)))
536+
v_interval = _api.deprecated(
537+
"3.6", alternative="get_view_interval", pending=True)(
538+
property(lambda self: self.get_view_interval(),
539+
lambda self, minmax: self.set_view_interval(*minmax)))
517540

518541

519542
class XAxis(Axis):
543+
axis_name = "x"
520544
get_view_interval, set_view_interval = maxis._make_getset_interval(
521545
"view", "xy_viewLim", "intervalx")
522546
get_data_interval, set_data_interval = maxis._make_getset_interval(
523547
"data", "xy_dataLim", "intervalx")
524548

525549

526550
class YAxis(Axis):
551+
axis_name = "y"
527552
get_view_interval, set_view_interval = maxis._make_getset_interval(
528553
"view", "xy_viewLim", "intervaly")
529554
get_data_interval, set_data_interval = maxis._make_getset_interval(
530555
"data", "xy_dataLim", "intervaly")
531556

532557

533558
class ZAxis(Axis):
559+
axis_name = "z"
534560
get_view_interval, set_view_interval = maxis._make_getset_interval(
535561
"view", "zz_viewLim", "intervalx")
536562
get_data_interval, set_data_interval = maxis._make_getset_interval(

0 commit comments

Comments
 (0)