web-dev-qa-db-fra.com

Imshow: étendue et aspect

J'écris un logiciel qui visualise les coupes et les projections à l'aide d'un jeu de données 3D. J'utilise matplotlib et plus précisément imshow pour visualiser les tampons d'image que je récupère de mon code d'analyse.

Etant donné que je souhaite annoter les images avec les axes de tracé, j’utilise le mot-clé d’extension fourni par imshow pour mapper les coordonnées de pixel du tampon d’image sur un système de coordonnées d’espace de données.

Malheureusement, matplotlib ne connaît pas les unités. Dites (en prenant un exemple artificiel) que je veux tracer une image avec les dimensions de 1000 m X 1 km. Dans ce cas, l'étendue serait quelque chose comme [0, 1000, 0, 1]. Même si la matrice d'images est carrée, étant donné que le rapport de format impliqué par le mot clé autant est 1000, les axes de tracé résultants ont également un rapport de format de 1000.

Est-il possible de forcer les proportions du tracé tout en conservant les graduations principales générées automatiquement en utilisant le mot-clé autant?

76
ngoldbaum

Vous pouvez le faire en définissant l’aspect de l’image manuellement (ou en le laissant à l’échelle automatique pour remplir l’étendue de la figure).

Par défaut, imshow définit l'aspect du tracé sur 1, car c'est souvent ce que les gens veulent pour les données d'image.

Dans votre cas, vous pouvez faire quelque chose comme:

import matplotlib.pyplot as plt
import numpy as np

grid = np.random.random((10,10))

fig, (ax1, ax2, ax3) = plt.subplots(nrows=3, figsize=(6,10))

ax1.imshow(grid, extent=[0,100,0,1])
ax1.set_title('Default')

ax2.imshow(grid, extent=[0,100,0,1], aspect='auto')
ax2.set_title('Auto-scaled Aspect')

ax3.imshow(grid, extent=[0,100,0,1], aspect=100)
ax3.set_title('Manually Set Aspect')

plt.tight_layout()
plt.show()

enter image description here

130
Joe Kington