@@ -274,14 +274,17 @@ def set_aspect(self, aspect, adjustable=None, anchor=None, share=False):
274274
275275 Parameters
276276 ----------
277- aspect : {'auto', 'equal'}
277+ aspect : {'auto', 'equal', 'equalxy', 'equalxz', 'equalyz' }
278278 Possible values:
279279
280280 ========= ==================================================
281281 value description
282282 ========= ==================================================
283283 'auto' automatic; fill the position rectangle with data.
284- 'equal' adapt the axes to have equal aspect ratios.
284+ 'equal' adapt all the axes to have equal aspect ratios.
285+ 'equalxy' adapt the x and y axes to have equal aspect ratios.
286+ 'equalxz' adapt the x and z axes to have equal aspect ratios.
287+ 'equalyz' adapt the y and z axes to have equal aspect ratios.
285288 ========= ==================================================
286289
287290 adjustable : None
@@ -315,25 +318,33 @@ def set_aspect(self, aspect, adjustable=None, anchor=None, share=False):
315318 --------
316319 mpl_toolkits.mplot3d.axes3d.Axes3D.set_box_aspect
317320 """
318- if aspect not in ('auto' , 'equal' ):
319- raise NotImplementedError (
320- "Axes3D currently only supports the aspect argument "
321- f"'auto' or 'equal'. You passed in { aspect !r} ."
322- )
321+ _api .check_in_list (('auto' , 'equal' , 'equalxy' , 'equalyz' , 'equalxz' ),
322+ aspect = aspect )
323323 super ().set_aspect (
324- aspect , adjustable = adjustable , anchor = anchor , share = share )
325-
326- if aspect == 'equal' :
327- v_intervals = np .vstack ((self .xaxis .get_view_interval (),
328- self .yaxis .get_view_interval (),
329- self .zaxis .get_view_interval ()))
330- mean = np .mean (v_intervals , axis = 1 )
331- delta = np .max (np .ptp (v_intervals , axis = 1 ))
324+ aspect = 'auto' , adjustable = adjustable , anchor = anchor , share = share )
325+
326+ if aspect in ('equal' , 'equalxy' , 'equalxz' , 'equalyz' ):
327+ if aspect == 'equal' :
328+ axis_indices = [0 , 1 , 2 ]
329+ elif aspect == 'equalxy' :
330+ axis_indices = [0 , 1 ]
331+ elif aspect == 'equalxz' :
332+ axis_indices = [0 , 2 ]
333+ elif aspect == 'equalyz' :
334+ axis_indices = [1 , 2 ]
335+
336+ view_intervals = np .array ([self .xaxis .get_view_interval (),
337+ self .yaxis .get_view_interval (),
338+ self .zaxis .get_view_interval ()])
339+ mean = np .mean (view_intervals , axis = 1 )
340+ delta = np .max (np .ptp (view_intervals , axis = 1 ))
332341 deltas = delta * self ._box_aspect / min (self ._box_aspect )
333342
334- self .set_xlim3d (mean [0 ] - deltas [0 ] / 2. , mean [0 ] + deltas [0 ] / 2. )
335- self .set_ylim3d (mean [1 ] - deltas [1 ] / 2. , mean [1 ] + deltas [1 ] / 2. )
336- self .set_zlim3d (mean [2 ] - deltas [2 ] / 2. , mean [2 ] + deltas [2 ] / 2. )
343+ for i , set_lim in enumerate ((self .set_xlim3d ,
344+ self .set_ylim3d ,
345+ self .set_zlim3d )):
346+ if i in axis_indices :
347+ set_lim (mean [i ] - deltas [i ]/ 2. , mean [i ] + deltas [i ]/ 2. )
337348
338349 def set_box_aspect (self , aspect , * , zoom = 1 ):
339350 """
0 commit comments