Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit cdf9e30

Browse files
authored
Merge pull request #14610 from meeseeksmachine/auto-backport-of-pr-14579-on-v3.1.x
Backport PR #14579 on branch v3.1.x (Fix inversion of 3d axis.)
2 parents 118ccec + 6824811 commit cdf9e30

File tree

3 files changed

+82
-83
lines changed

3 files changed

+82
-83
lines changed

lib/matplotlib/axis.py

Lines changed: 38 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1875,6 +1875,36 @@ def get_minpos(self):
18751875
raise NotImplementedError()
18761876

18771877

1878+
def _make_getset_interval(method_name, lim_name, attr_name):
1879+
"""
1880+
Helper to generate ``get_{data,view}_interval`` and
1881+
``set_{data,view}_interval`` implementations.
1882+
"""
1883+
1884+
def getter(self):
1885+
# docstring inherited.
1886+
return getattr(getattr(self.axes, lim_name), attr_name)
1887+
1888+
def setter(self, vmin, vmax, ignore=False):
1889+
# docstring inherited.
1890+
if ignore:
1891+
setattr(getattr(self.axes, lim_name), attr_name, (vmin, vmax))
1892+
else:
1893+
oldmin, oldmax = getter(self)
1894+
if oldmin < oldmax:
1895+
setter(self, min(vmin, vmax, oldmin), max(vmin, vmax, oldmax),
1896+
ignore=True)
1897+
else:
1898+
setter(self, max(vmin, vmax, oldmax), min(vmin, vmax, oldmin),
1899+
ignore=True)
1900+
self.stale = True
1901+
1902+
getter.__name__ = f"get_{method_name}_interval"
1903+
setter.__name__ = f"set_{method_name}_interval"
1904+
1905+
return getter, setter
1906+
1907+
18781908
class XAxis(Axis):
18791909
__name__ = 'xaxis'
18801910
axis_name = 'x'
@@ -2118,39 +2148,14 @@ def get_ticks_position(self):
21182148
"default": "default", "unknown": "unknown"}[
21192149
self._get_ticks_position()]
21202150

2121-
def get_view_interval(self):
2122-
# docstring inherited
2123-
return self.axes.viewLim.intervalx
2124-
2125-
def set_view_interval(self, vmin, vmax, ignore=False):
2126-
# docstring inherited
2127-
if ignore:
2128-
self.axes.viewLim.intervalx = vmin, vmax
2129-
else:
2130-
Vmin, Vmax = self.get_view_interval()
2131-
if Vmin < Vmax:
2132-
self.axes.viewLim.intervalx = (min(vmin, vmax, Vmin),
2133-
max(vmin, vmax, Vmax))
2134-
else:
2135-
self.axes.viewLim.intervalx = (max(vmin, vmax, Vmin),
2136-
min(vmin, vmax, Vmax))
2151+
get_view_interval, set_view_interval = _make_getset_interval(
2152+
"view", "viewLim", "intervalx")
2153+
get_data_interval, set_data_interval = _make_getset_interval(
2154+
"data", "dataLim", "intervalx")
21372155

21382156
def get_minpos(self):
21392157
return self.axes.dataLim.minposx
21402158

2141-
def get_data_interval(self):
2142-
# docstring inherited
2143-
return self.axes.dataLim.intervalx
2144-
2145-
def set_data_interval(self, vmin, vmax, ignore=False):
2146-
# docstring inherited
2147-
if ignore:
2148-
self.axes.dataLim.intervalx = vmin, vmax
2149-
else:
2150-
Vmin, Vmax = self.get_data_interval()
2151-
self.axes.dataLim.intervalx = min(vmin, Vmin), max(vmax, Vmax)
2152-
self.stale = True
2153-
21542159
def set_default_intervals(self):
21552160
# docstring inherited
21562161
xmin, xmax = 0., 1.
@@ -2445,40 +2450,14 @@ def get_ticks_position(self):
24452450
"default": "default", "unknown": "unknown"}[
24462451
self._get_ticks_position()]
24472452

2448-
def get_view_interval(self):
2449-
# docstring inherited
2450-
return self.axes.viewLim.intervaly
2451-
2452-
def set_view_interval(self, vmin, vmax, ignore=False):
2453-
# docstring inherited
2454-
if ignore:
2455-
self.axes.viewLim.intervaly = vmin, vmax
2456-
else:
2457-
Vmin, Vmax = self.get_view_interval()
2458-
if Vmin < Vmax:
2459-
self.axes.viewLim.intervaly = (min(vmin, vmax, Vmin),
2460-
max(vmin, vmax, Vmax))
2461-
else:
2462-
self.axes.viewLim.intervaly = (max(vmin, vmax, Vmin),
2463-
min(vmin, vmax, Vmax))
2464-
self.stale = True
2453+
get_view_interval, set_view_interval = _make_getset_interval(
2454+
"view", "viewLim", "intervaly")
2455+
get_data_interval, set_data_interval = _make_getset_interval(
2456+
"data", "dataLim", "intervaly")
24652457

24662458
def get_minpos(self):
24672459
return self.axes.dataLim.minposy
24682460

2469-
def get_data_interval(self):
2470-
# docstring inherited
2471-
return self.axes.dataLim.intervaly
2472-
2473-
def set_data_interval(self, vmin, vmax, ignore=False):
2474-
# docstring inherited
2475-
if ignore:
2476-
self.axes.dataLim.intervaly = vmin, vmax
2477-
else:
2478-
Vmin, Vmax = self.get_data_interval()
2479-
self.axes.dataLim.intervaly = min(vmin, Vmin), max(vmax, Vmax)
2480-
self.stale = True
2481-
24822461
def set_default_intervals(self):
24832462
# docstring inherited
24842463
ymin, ymax = 0., 1.

lib/mpl_toolkits/mplot3d/axis3d.py

Lines changed: 32 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,6 @@ def __init__(self, adir, v_intervalx, d_intervalx, axes, *args,
6868
rotate_label=None, **kwargs):
6969
# adir identifies which axes this is
7070
self.adir = adir
71-
# data and viewing intervals for this direction
72-
self.d_interval = d_intervalx
73-
self.v_interval = v_intervalx
7471

7572
# This is a temporary member variable.
7673
# Do not depend on this existing in future releases!
@@ -109,6 +106,10 @@ def __init__(self, adir, v_intervalx, d_intervalx, axes, *args,
109106
})
110107

111108
maxis.XAxis.__init__(self, axes, *args, **kwargs)
109+
110+
# data and viewing intervals for this direction
111+
self.d_interval = d_intervalx
112+
self.v_interval = v_intervalx
112113
self.set_rotate_label(rotate_label)
113114

114115
def init3d(self):
@@ -426,42 +427,49 @@ def draw(self, renderer):
426427
renderer.close_group('axis3d')
427428
self.stale = False
428429

429-
def get_view_interval(self):
430-
# docstring inherited
431-
return self.v_interval
432-
433-
def set_view_interval(self, vmin, vmax, ignore=False):
434-
# docstring inherited
435-
if ignore:
436-
self.v_interval = vmin, vmax
437-
else:
438-
Vmin, Vmax = self.get_view_interval()
439-
self.v_interval = min(vmin, Vmin), max(vmax, Vmax)
440-
441430
# TODO: Get this to work properly when mplot3d supports
442431
# the transforms framework.
443432
def get_tightbbox(self, renderer):
444433
# Currently returns None so that Axis.get_tightbbox
445434
# doesn't return junk info.
446435
return None
447436

437+
@property
438+
def d_interval(self):
439+
return self.get_data_interval()
440+
441+
@d_interval.setter
442+
def d_interval(self, minmax):
443+
return self.set_data_interval(*minmax)
444+
445+
@property
446+
def v_interval(self):
447+
return self.get_view_interval()
448+
449+
@d_interval.setter
450+
def v_interval(self, minmax):
451+
return self.set_view_interval(*minmax)
452+
448453

449454
# Use classes to look at different data limits
450455

451456

452457
class XAxis(Axis):
453-
def get_data_interval(self):
454-
# docstring inherited
455-
return self.axes.xy_dataLim.intervalx
458+
get_view_interval, set_view_interval = maxis._make_getset_interval(
459+
"view", "xy_viewLim", "intervalx")
460+
get_data_interval, set_data_interval = maxis._make_getset_interval(
461+
"data", "xy_dataLim", "intervalx")
456462

457463

458464
class YAxis(Axis):
459-
def get_data_interval(self):
460-
# docstring inherited
461-
return self.axes.xy_dataLim.intervaly
465+
get_view_interval, set_view_interval = maxis._make_getset_interval(
466+
"view", "xy_viewLim", "intervaly")
467+
get_data_interval, set_data_interval = maxis._make_getset_interval(
468+
"data", "xy_dataLim", "intervaly")
462469

463470

464471
class ZAxis(Axis):
465-
def get_data_interval(self):
466-
# docstring inherited
467-
return self.axes.zz_dataLim.intervalx
472+
get_view_interval, set_view_interval = maxis._make_getset_interval(
473+
"view", "zz_viewLim", "intervalx")
474+
get_data_interval, set_data_interval = maxis._make_getset_interval(
475+
"data", "zz_dataLim", "intervalx")

lib/mpl_toolkits/tests/test_mplot3d.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -851,6 +851,18 @@ def test_line3d_set_get_data_3d():
851851
np.testing.assert_array_equal((x2, y2, z2), line.get_data_3d())
852852

853853

854+
@check_figures_equal(extensions=["png"])
855+
def test_inverted(fig_test, fig_ref):
856+
# Plot then invert.
857+
ax = fig_test.add_subplot(projection="3d")
858+
ax.plot([1, 1, 10, 10], [1, 10, 10, 10], [1, 1, 1, 10])
859+
ax.invert_yaxis()
860+
# Invert then plot.
861+
ax = fig_ref.add_subplot(projection="3d")
862+
ax.invert_yaxis()
863+
ax.plot([1, 1, 10, 10], [1, 10, 10, 10], [1, 1, 1, 10])
864+
865+
854866
def test_inverted_cla():
855867
# Github PR #5450. Setting autoscale should reset
856868
# axes to be non-inverted.

0 commit comments

Comments
 (0)