Ustawianie proporcji wykresu 3D
Próbuję wykreślić trójwymiarowy obraz dna morskiego z danych przebiegu sonaru na 500 m przez 40 m części dna morskiego. Używam matplotlib / mplot3d z Axes3D i chcę mieć możliwość zmiany proporcji osi, tak aby oś x i y były skalowane. Przykładowy skrypt z wygenerowanymi danymi zamiast rzeczywistych danych to:
<code>import matplotlib.pyplot as plt from matplotlib import cm from mpl_toolkits.mplot3d import Axes3D import numpy as np # Create figure. fig = plt.figure() ax = fig.gca(projection = '3d') # Generate example data. R, Y = np.meshgrid(np.arange(0, 500, 0.5), np.arange(0, 40, 0.5)) z = 0.1 * np.abs(np.sin(R/40) * np.sin(Y/6)) # Plot the data. surf = ax.plot_surface(R, Y, z, cmap=cm.jet, linewidth=0) fig.colorbar(surf) # Set viewpoint. ax.azim = -160 ax.elev = 30 # Label axes. ax.set_xlabel('Along track (m)') ax.set_ylabel('Range (m)') ax.set_zlabel('Height (m)') # Save image. fig.savefig('data.png') </code>
I obraz wyjściowy z tego skryptu:
Teraz chciałbym to zmienić, aby 1 metr w osi wzdłużnej (x) był taki sam jak 1 metr w osi zakresu (y) (a może inny stosunek w zależności od względnych rozmiarów). Chciałbym również ustawić stosunek osi Z, ponownie niekoniecznie do 1: 1 ze względu na względne rozmiary danych, ale tak, że oś jest mniejsza niż bieżący wykres.
Próbowałem budować i używaćta gałąź matplotlib, postępując według przykładowego skryptu wta wiadomość z listy mailingowej, ale dodającax.pbaspect = [1.0, 1.0, 0.25]
line do mojego skryptu (po odinstalowaniu „standardowej” wersji matplotlib, aby zapewnić użycie niestandardowej wersji), nie miało to wpływu na generowany obraz.
Edytować: Tak więc pożądanym wyjściem będzie coś podobnego do poniższego (z grubsza edytowanego za pomocą obrazu Inkscape). W tym przypadku nie ustawiłem stosunku 1: 1 na osiach x / y, ponieważ wygląda to śmiesznie cienko, ale rozłożyłem go tak, aby nie był kwadratowy jak na oryginalnym wyjściu.