Ich glaube, dass Matplotlib noch nicht gleich die gleiche Achse in 3D gesetzt ... Aber ich habe vor einiger Zeit einen Trick gefunden (ich weiß nicht mehr wo), dass ich mich daran angepasst habe. Das Konzept besteht darin, eine falsche kubische Begrenzungsbox um Ihre Daten herum zu erstellen. Sie können es mit dem folgenden Code testen:
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 Daten sind etwa eine Größenordnung größer als x und y, aber auch mit dem gleichen Achse Option, matplotlib automatischen Skalierung z-Achse:
Aber wenn Sie den Begrenzungsrahmen hinzufügen, erhalten Sie eine korrekte Skalierung:
Vielen Dank. Es funktioniert super! – Olexandr
In diesem Fall brauchen Sie nicht einmal die "Gleich" -Anweisung - es wird immer gleich sein. – Olexandr
Vielleicht möchten Sie mit dem Aufrufen einer Variablen "scat" aufpassen ... – Ludwik