Comment égaliser les échelles de l'axe des x et de l'axe des y en Python matplotlib?

128

Je souhaite tracer des lignes sur un graphique carré.

Les échelles de x-axiset y-axisdevraient être les mêmes.

par exemple, x va de 0 à 10 et il est de 10 cm à l'écran. y doit également être compris entre 0 et 10 et doit également être de 10 cm.

La forme carrée doit être conservée, même si je joue avec la taille de la fenêtre.

Actuellement, mon graphique est mis à l'échelle avec la taille de la fenêtre.

Comment puis-je y parvenir?

METTRE À JOUR:

J'ai essayé ce qui suit, mais cela n'a pas fonctionné.

plt.xlim(-3, 3)
plt.ylim(-3, 3)
plt.axis('equal')
Jeu Sibbs
la source
Ça marche pour moi. Pouvez-vous publier un exemple de code entier qui ne fonctionne pas? Et pouvez-vous expliquer ce qui ne fonctionne pas? Voulez-vous seulement l'échelle de samen? Ou aussi la même gamme?
joris
1
@joris fondamentalement, je veux un graphe SQUARE fixe. Même si je maximise la fenêtre, j'espère que le CARRÉ est réservé. Mon écran est large, après avoir agrandi la fenêtre, le graphique devient également rectangulaire. Je veux que ce soit toujours SQUARE
Sibbs Gambling
Encore une fois, pouvez-vous publier un exemple de code complet. Parce que la réponse donnée devrait faire cela, conservez-la sous forme de carré. Ne pas conserver sa largeur ou sa hauteur, mais conserver sa forme.
joris
2
Veuillez essayer d'être un peu moins abrasif lorsque vous interagissez avec les autres sur SO. Vous obtenez de l'aide grâce à la gentillesse des gens, alors agissez un peu moins en droit.
tacaswell
pour la 3d, vous devez faire un peu plus de travail: stackoverflow.com/questions/13685386/...
Trevor Boyd Smith

Réponses:

179

Vous devez approfondir un peu l'API pour ce faire:

from matplotlib import pyplot as plt
plt.plot(range(5))
plt.xlim(-3, 3)
plt.ylim(-3, 3)
plt.gca().set_aspect('equal', adjustable='box')
plt.draw()

doc pour set_aspect

Tacaswell
la source
4
Impressionnant! Cela fonctionne en effet comme du charme. Pourriez-vous s'il vous plaît me dire quoi plt.plot(range(5))et plt.gca().set_aspect('equal', adjustable='box')faire, si cela ne vous dérange pas? De plus, je remarque que même si je ne l'ai pas fait plt.draw(), l'intrigue apparaîtra toujours. Alors à quoi ça sert?
Sibbs Gambling
l' plotest ont juste quelque chose à montrer. Pour le set_aspectlire le lien de documentation. Le but drawest juste de s'assurer qu'il est rendu.
tacaswell
1
pour avoir de fausses données à tracer (il aurait dû tracer une ligne droite).
tacaswell
1
@ perfectionm1ng pas de soucis, il m'a fallu un certain temps pour comprendre ce que vous demandiez.
tacaswell
1
Existe-t-il un moyen d'y parvenir sans avoir à spécifier exactement les limites? Je me serais attendu à ce qu'il y ait une simple commande pour obtenir un tracé carré avec la même échelle et les mêmes graduations pour les deux axes. Merci
Confondu le
70
plt.axis('scaled')

fonctionne bien pour moi.

myx
la source
A également travaillé pour moi. Assurez-vous simplement de l'utiliser avant de définir des limites / ticks, car il sera automatiquement redimensionné.
Andrew
3
Désolé, plt.axis ('scaled') n'a pas fonctionné pour moi dans Python 3.7 et matplotlib - matplotlib == 3.1.0 Cependant, plt.axis ('square') a fonctionné!
rishi jain
19

Essayez quelque chose comme:

import pylab as p
p.plot(x,y)
p.axis('equal')
p.show()
Dman2
la source
Cela fonctionne sur mon système, peut-être pourriez-vous montrer une partie du code sur lequel vous travaillez? Pourrait être en mesure d'aider à résoudre le problème plus rapidement.
Dman2
Cela ne fonctionne PAS en général. Les axes sont égaux, mais le tracé n'est pas carré, sauf si la fenêtre de traçage est également carrée. Testé avec Matplotlib 2.0
divenex
P.axis('equal')semble être comme P.gca().set_aspect('equal', adjustable='datalim'). Alors que si adjustable='box', alors le tracé devient carré.
Evgeni Sergeev
Je n’en tire certainement pas une boîte carrée.
Peter Drake
pylab est dépréciée
eric
19

Consultez la documentation sur plt.axis(). Ce:

plt.axis('equal')

ne fonctionne pas car il modifie les limites de l'axe pour faire apparaître les cercles circulaires. Ce que tu veux c'est:

plt.axis('square')

Cela crée un tracé carré avec des axes égaux.

Adam Stewart
la source