如何在Python的Matplotlib中绘制轴长相等的3D几何图形?
解决Matplotlib 3D绘图中X/Y/Z轴等长的问题
Matplotlib的3D轴默认会根据数据范围自动调整显示比例,导致视觉上轴长不等。要实现三个轴长度相等,只需在代码中添加轴比例设置即可,具体方案如下:
推荐方案(Matplotlib 3.3+版本)
使用set_box_aspect方法直接指定三个轴的显示比例为1:1:1,这是官方推荐的3D轴等长设置方式:
def plotting(x, y, z, figname): fig = plt.figure(figsize = (50,50)) ax = plt.axes(projection='3d') ax.grid() # 核心:设置X/Y/Z轴显示比例为1:1:1 ax.set_box_aspect([1, 1, 1]) ax.scatter(x, y, z, c = 'r', s = 50) ax.set_title(figname) ax.set_xlabel('x', labelpad=20) ax.set_ylabel('y', labelpad=20) ax.set_zlabel('z', labelpad=20)
兼容旧版本方案(Matplotlib <3.3)
如果你的Matplotlib版本较低,set_box_aspect不可用,可以手动计算数据范围并统一各轴的显示区间:
import numpy as np def plotting(x, y, z, figname): fig = plt.figure(figsize = (50,50)) ax = plt.axes(projection='3d') ax.grid() # 计算数据的最大范围,统一各轴显示区间 max_range = np.array([x.max()-x.min(), y.max()-y.min(), z.max()-z.min()]).max() x_center = x.mean() y_center = y.mean() z_center = z.mean() ax.set_xlim(x_center - max_range/2, x_center + max_range/2) ax.set_ylim(y_center - max_range/2, y_center + max_range/2) ax.set_zlim(z_center - max_range/2, z_center + max_range/2) ax.scatter(x, y, z, c = 'r', s = 50) ax.set_title(figname) ax.set_xlabel('x', labelpad=20) ax.set_ylabel('y', labelpad=20) ax.set_zlabel('z', labelpad=20)
内容的提问来源于stack exchange,提问作者Urvesh
相关产品推荐
相关产品推荐

