Skip to content

Commit 30724fb

Browse files
committed
Provide adjustable='box' for aspect('equal') in 3D.
1 parent 65cbdef commit 30724fb

File tree

2 files changed

+37
-12
lines changed

2 files changed

+37
-12
lines changed

doc/users/next_whats_new/3d_plot_aspects.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,6 @@ Users can set the aspect ratio for the X, Y, Z axes of a 3D plot to be 'equal',
2727
for i, ax in enumerate(axs):
2828
ax.set_box_aspect((3, 4, 5))
2929
ax.set_aspect(aspects[i])
30-
ax.set_title("set_aspect('{aspects[i]}')")
30+
ax.set_title(f"set_aspect('{aspects[i]}')")
3131

3232
plt.show()

lib/mpl_toolkits/mplot3d/axes3d.py

Lines changed: 36 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -336,17 +336,42 @@ def set_aspect(self, aspect, adjustable=None, anchor=None, share=False):
336336
view_intervals = np.array([self.xaxis.get_view_interval(),
337337
self.yaxis.get_view_interval(),
338338
self.zaxis.get_view_interval()])
339-
mean = np.mean(view_intervals, axis=1)
340-
ptp = np.ptp(view_intervals, axis=1)
341-
delta = max(ptp[ax_indices])
342-
scale = self._box_aspect[ptp == delta][0]
343-
deltas = delta * self._box_aspect / scale
344-
345-
for i, set_lim in enumerate((self.set_xlim3d,
346-
self.set_ylim3d,
347-
self.set_zlim3d)):
348-
if i in ax_indices:
349-
set_lim(mean[i] - deltas[i]/2., mean[i] + deltas[i]/2.)
339+
if adjustable == 'datalim':
340+
mean = np.mean(view_intervals, axis=1)
341+
ptp = np.ptp(view_intervals, axis=1)
342+
delta = max(ptp[ax_indices])
343+
scale = self._box_aspect[ptp == delta][0]
344+
deltas = delta * self._box_aspect / scale
345+
346+
for i, set_lim in enumerate((self.set_xlim3d,
347+
self.set_ylim3d,
348+
self.set_zlim3d)):
349+
if i in ax_indices:
350+
set_lim(mean[i] - deltas[i]/2., mean[i] + deltas[i]/2.)
351+
elif adjustable == 'box':
352+
deltas = np.ptp(view_intervals, axis=1)
353+
box_aspect = self.get_box_aspect()
354+
if aspect == 'equal':
355+
box_aspect = np.ptp(view_intervals, axis=1)
356+
elif aspect == 'equalxy':
357+
old_diag = box_aspect[0] ** 2 + box_aspect[1] ** 2
358+
new_diag = deltas[0] ** 2 + deltas[1] ** 2
359+
box_aspect[0] = deltas[0]
360+
box_aspect[1] = deltas[1]
361+
box_aspect[2] *= new_diag / old_diag
362+
elif aspect == 'equalxz':
363+
old_diag = box_aspect[0] ** 2 + box_aspect[2] ** 2
364+
new_diag = deltas[0] ** 2 + deltas[2] ** 2
365+
box_aspect[0] = deltas[0]
366+
box_aspect[1] *= new_diag / old_diag
367+
box_aspect[2] = deltas[2]
368+
elif aspect == 'equalyz':
369+
old_diag = box_aspect[1] ** 2 + box_aspect[2] ** 2
370+
new_diag = deltas[1] ** 2 + deltas[2] ** 2
371+
box_aspect[0] *= new_diag / old_diag
372+
box_aspect[1] = deltas[1]
373+
box_aspect[2] = deltas[2]
374+
self.set_box_aspect(box_aspect)
350375

351376
def set_box_aspect(self, aspect, *, zoom=1):
352377
"""

0 commit comments

Comments
 (0)