为了账号安全,请及时绑定邮箱和手机立即绑定

matplotlib(单位长度相等):纵横比“相等”时,z轴不等于x-和y-

matplotlib(单位长度相等):纵横比“相等”时,z轴不等于x-和y-

呼如林 2019-11-27 13:11:48
当我为3d图形设置相等的长宽比时,z轴不会更改为“相等”。所以这:fig = pylab.figure()mesFig = fig.gca(projection='3d', adjustable='box')mesFig.axis('equal')mesFig.plot(xC, yC, zC, 'r.')mesFig.plot(xO, yO, zO, 'b.')pyplot.show()给我以下内容: 在此处输入图片说明显然,z轴的单位长度不等于x和y单位。如何使三个轴的单位长度相等?我能找到的所有解决方案都行不通。谢谢。
查看完整描述

3 回答

?
不负相思意

TA贡献1777条经验 获得超10个赞

我相信matplotlib尚未在3D中正确设置相等的轴...但是我前段时间发现了一个技巧(我不记得在哪里),我已经使用它了。概念是在数据周围创建一个假的立方体边界框。您可以使用以下代码对其进行测试:


from mpl_toolkits.mplot3d import Axes3D

from matplotlib import cm

import matplotlib.pyplot as plt

import numpy as np


fig = plt.figure()

ax = fig.gca(projection='3d')

ax.set_aspect('equal')


X = np.random.rand(100)*10+5

Y = np.random.rand(100)*5+2.5

Z = np.random.rand(100)*50+25


scat = ax.scatter(X, Y, Z)


# Create cubic bounding box to simulate equal aspect ratio

max_range = np.array([X.max()-X.min(), Y.max()-Y.min(), Z.max()-Z.min()]).max()

Xb = 0.5*max_range*np.mgrid[-1:2:2,-1:2:2,-1:2:2][0].flatten() + 0.5*(X.max()+X.min())

Yb = 0.5*max_range*np.mgrid[-1:2:2,-1:2:2,-1:2:2][1].flatten() + 0.5*(Y.max()+Y.min())

Zb = 0.5*max_range*np.mgrid[-1:2:2,-1:2:2,-1:2:2][2].flatten() + 0.5*(Z.max()+Z.min())

# Comment or uncomment following both lines to test the fake bounding box:

for xb, yb, zb in zip(Xb, Yb, Zb):

   ax.plot([xb], [yb], [zb], 'w')


plt.grid()

plt.show()

z数据大约比x和y大一个数量级,但是即使使用相等轴选项,matplotlib也会自动缩放z轴:



但是,如果添加边界框,则会获得正确的缩放比例:


查看完整回答
反对 回复 2019-11-27
  • 3 回答
  • 0 关注
  • 1561 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信