Skip to content

Commit 32390ed

Browse files
committed
Make Axis3D constructor signature closer to the one of 2D axis.
Setting `adir` to a direction not matching the specific axis class doesn't make sense anyways; the viewlims and datalims properties previously got init'ed to their preexisting values; and init3d doesn't warrant being a separate public API.
1 parent 9c77f6b commit 32390ed

File tree

3 files changed

+62
-20
lines changed

3 files changed

+62
-20
lines changed
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
``Axis3D`` constructor
2+
~~~~~~~~~~~~~~~~~~~~~~
3+
The previous constructor of `.Axis3D`, 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+
``Axes3D.init3d`` is also deprecated; all the relevant initialization is done
12+
as part of the constructor.

lib/mpl_toolkits/mplot3d/axes3d.py

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

195195
def _init_axis(self):
196196
"""Init 3D axes; overrides creation of regular X/Y axes."""
197-
self.xaxis = axis3d.XAxis('x', self.xy_viewLim.intervalx,
198-
self.xy_dataLim.intervalx, self)
199-
self.yaxis = axis3d.YAxis('y', self.xy_viewLim.intervaly,
200-
self.xy_dataLim.intervaly, self)
201-
self.zaxis = axis3d.ZAxis('z', self.zz_viewLim.intervalx,
202-
self.zz_dataLim.intervalx, self)
203-
for ax in self.xaxis, self.yaxis, self.zaxis:
204-
ax.init3d()
197+
self.xaxis = axis3d.XAxis(self)
198+
self.yaxis = axis3d.YAxis(self)
199+
self.zaxis = axis3d.ZAxis(self)
205200

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

lib/mpl_toolkits/mplot3d/axis3d.py

Lines changed: 47 additions & 12 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__)}")
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,17 @@ 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.d_interval = params["d_intervalx"]
133+
if "v_intervalx" in params:
134+
self.v_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")(property(lambda self: self.axis_name))
112140

113-
def init3d(self):
141+
def _init3d(self):
114142
self.line = mlines.Line2D(
115143
xdata=(0, 0), ydata=(0, 0),
116144
linewidth=self._axinfo['axisline']['linewidth'],
@@ -133,6 +161,10 @@ def init3d(self):
133161
self.label._transform = self.axes.transData
134162
self.offsetText._transform = self.axes.transData
135163

164+
@_api.deprecated("3.6")
165+
def init3d(self): # After deprecation elapses, inline _init3d to __init__.
166+
self._init3d()
167+
136168
def get_major_ticks(self, numticks=None):
137169
ticks = super().get_major_ticks(numticks)
138170
for t in ticks:
@@ -517,20 +549,23 @@ def v_interval(self, minmax):
517549

518550

519551
class XAxis(Axis):
552+
axis_name = "x"
520553
get_view_interval, set_view_interval = maxis._make_getset_interval(
521554
"view", "xy_viewLim", "intervalx")
522555
get_data_interval, set_data_interval = maxis._make_getset_interval(
523556
"data", "xy_dataLim", "intervalx")
524557

525558

526559
class YAxis(Axis):
560+
axis_name = "y"
527561
get_view_interval, set_view_interval = maxis._make_getset_interval(
528562
"view", "xy_viewLim", "intervaly")
529563
get_data_interval, set_data_interval = maxis._make_getset_interval(
530564
"data", "xy_dataLim", "intervaly")
531565

532566

533567
class ZAxis(Axis):
568+
axis_name = "z"
534569
get_view_interval, set_view_interval = maxis._make_getset_interval(
535570
"view", "zz_viewLim", "intervalx")
536571
get_data_interval, set_data_interval = maxis._make_getset_interval(

0 commit comments

Comments
 (0)