Sto provando a tracciare un'immagine 3D del fondo marino dai dati di un sonar eseguito su una porzione di 500 m per 40 m del fondo marino. Sto usando matplotlib/mplot3d con Axes3D e voglio essere in grado di modificare le proporzioni degli assi in modo che l'asse x & sia in scala. Uno script di esempio con dati generati piuttosto che i dati reali sono:Impostazione del rapporto di aspetto del grafico 3D
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')
E l'immagine in uscita da questo script:
Ora vorrei cambiare in modo che 1 metro nella l'asse lungo la traccia (x) è lo stesso di 1 metro nell'asse (y) (o forse un rapporto diverso a seconda delle dimensioni relative coinvolte). Mi piacerebbe anche impostare il rapporto tra l'asse z, ancora non necessariamente a 1: 1 a causa delle dimensioni relative nei dati, ma così l'asse è più piccolo del grafico corrente.
ho provato costruzione e l'utilizzo di this branch of matplotlib, seguendo l'script di esempio in this message from the mailing list, ma aggiungendo la linea ax.pbaspect = [1.0, 1.0, 0.25]
al mio script (dopo aver disinstallato la versione 'standard' di matplotlib per assicurare la versione personalizzata che veniva usata) non ha fatto qualsiasi differenza nell'immagine generata.
Modifica: Quindi l'output desiderato sarebbe qualcosa come la seguente immagine (modificata con Inkscape). In questo caso, non ho impostato un rapporto 1: 1 sugli assi x/y perché sembra ridicolmente sottile, ma l'ho steso in modo che non sia quadrato come nell'output originale.
Hmmm. Ciò comporta il corretto ridimensionamento degli assi, ma comporta un notevole spreco di spazio. Mentre io * potevo * salvare questo come SVG e modificarlo manualmente (come quello che ho fatto con l'immagine desiderata con la quale ho appena aggiornato la domanda) questo diventerebbe molto noioso quando ho un gran numero di immagini da creare, e non lo sono sicuro che potrebbe essere automatizzato ... – Blair
Puoi usare la modifica pbaspect per non ottenere assi quadrati. Ho modificato la risposta. – HYRY
Fantastico, grazie! – Blair