@@ -274,14 +274,17 @@ def set_aspect(self, aspect, adjustable=None, anchor=None, share=False):
274
274
275
275
Parameters
276
276
----------
277
- aspect : {'auto', 'equal'}
277
+ aspect : {'auto', 'equal', 'equalxy', 'equalxz', 'equalyz' }
278
278
Possible values:
279
279
280
280
========= ==================================================
281
281
value description
282
282
========= ==================================================
283
283
'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.
285
288
========= ==================================================
286
289
287
290
adjustable : None
@@ -315,25 +318,33 @@ def set_aspect(self, aspect, adjustable=None, anchor=None, share=False):
315
318
--------
316
319
mpl_toolkits.mplot3d.axes3d.Axes3D.set_box_aspect
317
320
"""
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 )
323
323
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 ))
332
341
deltas = delta * self ._box_aspect / min (self ._box_aspect )
333
342
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. )
337
348
338
349
def set_box_aspect (self , aspect , * , zoom = 1 ):
339
350
"""
0 commit comments