J'essaie de tracer une image 3D du fond marin à partir des données d'un sonar sur une portion de 500m par 40m du fond marin. J'utilise matplotlib/mplot3d avec Axes3D et je veux être en mesure de changer le rapport d'aspect des axes de sorte que l'axe y x & y soient à l'échelle. Un exemple de script avec des données générées plutôt que les données réelles est:Réglage du rapport d'aspect du tracé 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')
Et l'image de sortie de ce script:
Maintenant, je voudrais changer de sorte que 1 mètre dans la l'axe longitudinal (x) est le même que 1 mètre dans l'axe de distance (y) (ou peut-être un rapport différent selon les tailles relatives). Je voudrais également définir le rapport de l'axe z, encore une fois pas nécessairement à 1: 1 en raison des tailles relatives dans les données, mais si l'axe est plus petit que le tracé actuel.
J'ai essayé la construction et l'utilisation this branch of matplotlib, suivant l'exemple de script dans this message from the mailing list, mais en ajoutant la ligne ax.pbaspect = [1.0, 1.0, 0.25]
à mon script (après avoir désinstallé la version « standard » de matplotlib pour assurer la version personnalisée a été utilisée) n'a pas fait toute différence dans l'image générée.
Editer: Donc la sortie désirée serait quelque chose comme l'image suivante (grossièrement éditée avec Inkscape). Dans ce cas, je n'ai pas mis un rapport de 1: 1 sur les axes x/y parce que cela semble ridiculement mince, mais je l'ai étalé de sorte qu'il ne soit pas carré comme sur la sortie d'origine.
Hmmm. Cela permet de corriger la mise à l'échelle des axes, mais entraîne beaucoup d'espace gaspillé. Bien que je * puisse * enregistrer ceci en tant que SVG et l'éditer manuellement (comme ce que j'ai fait avec l'image que je viens de mettre à jour) cela deviendrait très fastidieux quand j'ai un grand nombre d'images à créer, et je ne suis pas Assurez-vous qu'il peut être automatisé ... – Blair
Vous pouvez utiliser la modification pbaspect pour ne pas avoir d'axes carrés. J'ai édité la réponse. – HYRY
Génial, merci! – Blair