设置matplotlib 3D图形的纵横比

77 投票
12 回答
79847 浏览
提问于 2025-04-17 06:20
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

设置宽高比在二维图形中是有效的:

ax = plt.axes()
ax.plot([0,1], [0,10])
ax.set_aspect('equal', 'box')

但是在三维图形中就不行:

ax = plt.axes(projection='3d')
ax.plot([0,1], [0,1], [0,10])
ax.set_aspect('equal', 'box')

我该如何为三维图形设置宽高比呢?

12 个回答

29

我没有尝试所有这些答案,但这个临时解决方案对我有效:

def axisEqual3D(ax):
    extents = np.array([getattr(ax, 'get_{}lim'.format(dim))() for dim in 'xyz'])
    sz = extents[:,1] - extents[:,0]
    centers = np.mean(extents, axis=1)
    maxsize = max(abs(sz))
    r = maxsize/2
    for ctr, dim in zip(centers, 'xyz'):
        getattr(ax, 'set_{}lim'.format(dim))(ctr - r, ctr + r)
61

从matplotlib 3.3.0版本开始,Axes3D.set_box_aspect 似乎是推荐的做法。

import numpy as np
import matplotlib.pyplot as plt

xs, ys, zs = ...
ax = plt.axes(projection='3d')

ax.set_box_aspect((np.ptp(xs), np.ptp(ys), np.ptp(zs)))  # aspect ratio is 1:1:1 in data space

ax.plot(xs, ys, zs)
4

我的理解是,这个功能还没有实现(可以查看GitHub上的这个问题)。我也希望它能尽快实现。你可以看看这个链接,里面有一个可能的解决办法(不过我自己还没有测试过)。

撰写回答