web-dev-qa-db-fra.com

matplotlib.pyplot, conserve les proportions de l'intrigue

En supposant que nous ayons un polygone comme polygone = [(x1, y1), (x2, y2), ...], le code suivant affiche le polygone:

import matplotlib.pyplot as plt
plt.fill(*Zip(*polygon))
plt.show()

Par défaut, il essaie d'ajuster le rapport hauteur/largeur afin que le polygone (ou tout autre diagramme) tienne à l'intérieur de la fenêtre, et le change automatiquement pour qu'il tienne même après le redimensionnement. Ce qui est génial dans de nombreux cas, sauf lorsque vous essayez d'estimer visuellement si l'image est déformée. Comment fixer le rapport d'aspect à strictement 1: 1?

(Je ne sais pas si "rapport hauteur/largeur" ​​est le bon terme ici, donc dans le cas contraire - j'ai besoin que les axes X et Y aient une échelle de 1: 1, de sorte que (0, 1) sur X et Y prenne exactement même espace d'écran. Et je dois le garder 1: 1, peu importe comment je redimensionne la fenêtre.)

43
Headcrab

Est-il utile d'utiliser:

plt.axis('equal')
77
Olivier Verdier

Il y a, je suis sûr, un moyen de régler cela directement dans le cadre de votre commande plot, mais je ne me souviens pas de l'astuce. Pour le faire après coup, vous pouvez utiliser l'axe actuel et définir son rapport hauteur/largeur avec "set_aspect ('equal')". Dans votre exemple:

import matplotlib.pyplot as plt
plt.fill(*Zip(*polygon))
plt.axes().set_aspect('equal', 'datalim')
plt.show()

J'utilise cela tout le temps et c'est à partir des exemples sur le site Web de matplotlib.

18
user348863

"mis à l'échelle" en utilisant plt

La meilleure chose à faire est d'utiliser:

 plt.axis('scaled')

Comme l'a dit Saullo Castro. Parce qu'à égalité, vous ne pouvez pas modifier une limite d'axe sans changer l'autre, donc si vous souhaitez adapter toutes les figures non carrées, vous aurez beaucoup d'espace blanc.

Égal

enter image description here

Escaladé

enter image description here

hache unsing "égale"

Alternativement, vous pouvez utiliser la classe d'axes .

fig = plt.figure()
ax = figure.add_subplot(111)
ax.imshow(image)
ax.axes.set_aspect('equal')
10
G M

Mieux plt.axis('scaling'), cela fonctionne mieux si vous souhaitez modifier les axes avec xlim() et ylim().

0
ledmike