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

Skip to content

Commit 5112998

Browse files
Respect limit_range_for_scale in 3d
1 parent 657942a commit 5112998

1 file changed

Lines changed: 46 additions & 21 deletions

File tree

lib/mpl_toolkits/mplot3d/axes3d.py

Lines changed: 46 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1125,14 +1125,15 @@ def set_xscale(self, value, **kwargs):
11251125
Keyword arguments are forwarded to the scale class.
11261126
For example, ``base=2`` can be passed when using a log scale.
11271127
"""
1128-
# For non-linear scales, set valid limits before changing scale
1129-
# to avoid warnings about invalid limits
1130-
if value != 'linear':
1131-
vmin, vmax = self.get_xlim()
1132-
if vmin <= 0 or vmax <= 0:
1133-
# Set temporary valid limits before scale change
1134-
self.set_xlim(1, 10, auto=True)
11351128
self.xaxis._set_axes_scale(value, **kwargs)
1129+
# After setting scale, constrain limits using scale's limit_range_for_scale
1130+
if hasattr(self.xaxis, '_scale') and self.xaxis._scale is not None:
1131+
vmin, vmax = self.get_xlim()
1132+
minpos = getattr(self.xaxis, '_minpos', 1e-300)
1133+
new_vmin, new_vmax = self.xaxis._scale.limit_range_for_scale(
1134+
vmin, vmax, minpos)
1135+
if (new_vmin, new_vmax) != (vmin, vmax):
1136+
self.set_xlim(new_vmin, new_vmax, auto=True)
11361137

11371138
def set_yscale(self, value, **kwargs):
11381139
"""
@@ -1148,14 +1149,15 @@ def set_yscale(self, value, **kwargs):
11481149
Keyword arguments are forwarded to the scale class.
11491150
For example, ``base=2`` can be passed when using a log scale.
11501151
"""
1151-
# For non-linear scales, set valid limits before changing scale
1152-
# to avoid warnings about invalid limits
1153-
if value != 'linear':
1154-
vmin, vmax = self.get_ylim()
1155-
if vmin <= 0 or vmax <= 0:
1156-
# Set temporary valid limits before scale change
1157-
self.set_ylim(1, 10, auto=True)
11581152
self.yaxis._set_axes_scale(value, **kwargs)
1153+
# After setting scale, constrain limits using scale's limit_range_for_scale
1154+
if hasattr(self.yaxis, '_scale') and self.yaxis._scale is not None:
1155+
vmin, vmax = self.get_ylim()
1156+
minpos = getattr(self.yaxis, '_minpos', 1e-300)
1157+
new_vmin, new_vmax = self.yaxis._scale.limit_range_for_scale(
1158+
vmin, vmax, minpos)
1159+
if (new_vmin, new_vmax) != (vmin, vmax):
1160+
self.set_ylim(new_vmin, new_vmax, auto=True)
11591161

11601162
def set_zscale(self, value, **kwargs):
11611163
"""
@@ -1171,14 +1173,15 @@ def set_zscale(self, value, **kwargs):
11711173
Keyword arguments are forwarded to the scale class.
11721174
For example, ``base=2`` can be passed when using a log scale.
11731175
"""
1174-
# For non-linear scales, set valid limits before changing scale
1175-
# to avoid warnings about invalid limits
1176-
if value != 'linear':
1177-
vmin, vmax = self.get_zlim()
1178-
if vmin <= 0 or vmax <= 0:
1179-
# Set temporary valid limits before scale change
1180-
self.set_zlim(1, 10, auto=True)
11811176
self.zaxis._set_axes_scale(value, **kwargs)
1177+
# After setting scale, constrain limits using scale's limit_range_for_scale
1178+
if hasattr(self.zaxis, '_scale') and self.zaxis._scale is not None:
1179+
vmin, vmax = self.get_zlim()
1180+
minpos = getattr(self.zaxis, '_minpos', 1e-300)
1181+
new_vmin, new_vmax = self.zaxis._scale.limit_range_for_scale(
1182+
vmin, vmax, minpos)
1183+
if (new_vmin, new_vmax) != (vmin, vmax):
1184+
self.set_zlim(new_vmin, new_vmax, auto=True)
11821185

11831186
get_zticks = _axis_method_wrapper("zaxis", "get_ticklocs")
11841187
set_zticks = _axis_method_wrapper("zaxis", "set_ticks")
@@ -1910,6 +1913,17 @@ def drag_pan(self, button, key, x, y):
19101913
new_ymin, new_ymax = y_inv.transform([new_ymin_scaled, new_ymax_scaled])
19111914
new_zmin, new_zmax = z_inv.transform([new_zmin_scaled, new_zmax_scaled])
19121915

1916+
# Validate limits for scale constraints (e.g., positive for log scale)
1917+
minpos = self.xy_dataLim.minposx
1918+
new_xmin, new_xmax = self.xaxis._scale.limit_range_for_scale(
1919+
new_xmin, new_xmax, minpos)
1920+
minpos = self.xy_dataLim.minposy
1921+
new_ymin, new_ymax = self.yaxis._scale.limit_range_for_scale(
1922+
new_ymin, new_ymax, minpos)
1923+
minpos = self.zz_dataLim.minposx
1924+
new_zmin, new_zmax = self.zaxis._scale.limit_range_for_scale(
1925+
new_zmin, new_zmax, minpos)
1926+
19131927
# Set the new axis limits
19141928
self.set_xlim3d(new_xmin, new_xmax, auto=None)
19151929
self.set_ylim3d(new_ymin, new_ymax, auto=None)
@@ -2061,6 +2075,17 @@ def _scale_axis_limits(self, scale_x, scale_y, scale_z):
20612075
new_ymin, new_ymax = y_inv.transform([new_ymin_scaled, new_ymax_scaled])
20622076
new_zmin, new_zmax = z_inv.transform([new_zmin_scaled, new_zmax_scaled])
20632077

2078+
# Validate limits for scale constraints (e.g., positive for log scale)
2079+
minpos = self.xy_dataLim.minposx
2080+
new_xmin, new_xmax = self.xaxis._scale.limit_range_for_scale(
2081+
new_xmin, new_xmax, minpos)
2082+
minpos = self.xy_dataLim.minposy
2083+
new_ymin, new_ymax = self.yaxis._scale.limit_range_for_scale(
2084+
new_ymin, new_ymax, minpos)
2085+
minpos = self.zz_dataLim.minposx
2086+
new_zmin, new_zmax = self.zaxis._scale.limit_range_for_scale(
2087+
new_zmin, new_zmax, minpos)
2088+
20642089
# Set the new axis limits
20652090
self.set_xlim3d(new_xmin, new_xmax, auto=None)
20662091
self.set_ylim3d(new_ymin, new_ymax, auto=None)

0 commit comments

Comments
 (0)