@@ -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