私はmatplotlibがまだ3次元で正しく等しい軸を設定していないと信じています...しかし、私はそれを使って適応したトリックを何度か前に見つけました。概念は、あなたのデータの周りに偽の立方体のバウンディングボックスを作成することです。次のコードでそれをテストすることができ :
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軸と:
しかし、あなたはバウンディングボックスを追加した場合、あなたは正しいスケーリング入手:
ありがとうございます。それは素晴らしい作品です! – Olexandr
この場合、 'equal'ステートメントは必要ありません。常に等しくなります。 – Olexandr
変数 "scat"を呼び出すことに気をつけたいかもしれません... – Ludwik