Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit cdf9e30

Browse filesBrowse 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
Copy full SHA for cdf9e30

File tree

Expand file treeCollapse file tree

3 files changed

+82
-83
lines changed
Filter options
Expand file treeCollapse file tree

3 files changed

+82
-83
lines changed

‎lib/matplotlib/axis.py

Copy file name to clipboardExpand all lines: lib/matplotlib/axis.py
+38-59Lines 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

Copy file name to clipboardExpand all lines: lib/mpl_toolkits/mplot3d/axis3d.py
+32-24Lines 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

Copy file name to clipboardExpand all lines: lib/mpl_toolkits/tests/test_mplot3d.py
+12Lines 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 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.