Come equalizzare le scale dell'asse xe dell'asse y in Python matplotlib?


128

Desidero tracciare linee su un grafico quadrato.

Le scale di x-axise y-axisdovrebbero essere le stesse.

ad es. x varia da 0 a 10 ed è 10 cm sullo schermo. Anche y deve variare da 0 a 10 e deve essere anche di 10 cm.

La forma quadrata deve essere mantenuta, anche se scherzo con le dimensioni della finestra.

Attualmente, il mio grafico scala insieme alla dimensione della finestra.

Come posso ottenerlo?

AGGIORNARE:

Ho provato quanto segue, ma non ha funzionato.

plt.xlim(-3, 3)
plt.ylim(-3, 3)
plt.axis('equal')

Sta funzionando per me. Puoi pubblicare un intero esempio di codice che non funziona? E puoi spiegare cosa non funziona? Vuoi solo la stessa scala? O anche della stessa gamma?
joris

1
@joris fondamentalmente voglio un grafico SQUARE fisso. Anche se ingrandisco la finestra, spero che la SQUARE sia riservata. Il mio schermo è ampio, dopo aver ingrandito la finestra, anche il grafico diventa rettangolare. Voglio che sia ancora SQUARE
Sibbs Gambling

Di nuovo, puoi pubblicare un esempio di codice completo. Poiché la risposta data dovrebbe farlo, conservala come un quadrato. Non conserva la sua larghezza o altezza, ma conserva la sua forma.
joris

2
Per favore, cerca di essere un po 'meno abrasivo quando interagisci con gli altri su SO. Stai ricevendo aiuto dalla gentilezza delle persone, quindi agisci in modo un po 'meno autorizzato.
tacaswell

per il 3d, devi fare un po 'di lavoro extra: stackoverflow.com/questions/13685386/…
Trevor Boyd Smith,

Risposte:


179

È necessario scavare un po 'più a fondo nell'api per fare questo:

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 per set_aspect


4
Eccezionale! Funziona davvero come un fascino. Potresti per favore dirmi cosa plt.plot(range(5))e plt.gca().set_aspect('equal', adjustable='box')fare, se non ti dispiace? Inoltre, noto che anche se non l'ho fatto plt.draw(), la trama verrà comunque visualizzata. Allora a cosa serve?
Sibbs Gambling

il plotè solo hanno qualcosa da mostrare. Per set_aspectleggere il link alla documentazione. Il drawè solo per assicurarsi che venga eseguito il rendering.
tacaswell

1
avere alcuni dati falsi da tracciare (avrebbe dovuto tracciare una linea retta).
tacaswell

1
@ perfectionm1ng non preoccuparti, mi ci è voluto un po 'per capire cosa stavi chiedendo.
tacaswell

1
C'è un modo per farlo senza dover specificare esattamente i limiti? Mi sarei aspettato che ci fosse un semplice comando per ottenere un grafico quadrato con la stessa scala e le tacche per entrambi gli assi. Grazie
Confuso

70
plt.axis('scaled')

funziona bene per me.


Ha funzionato anche per me. Assicurati di usarlo prima di impostare limiti / tick, poiché si ridimensionerà automaticamente.
Andrew

3
Spiacenti, plt.axis ('scaled') non ha funzionato per me in Python 3.7 e matplotlib - matplotlib == 3.1.0 Tuttavia, plt.axis ('square') ha funzionato!
rishi jain

19

Prova qualcosa come:

import pylab as p
p.plot(x,y)
p.axis('equal')
p.show()

Funziona sul mio sistema, forse potresti mostrare una parte del codice su cui stai lavorando? Potrebbe essere in grado di risolvere il problema più rapidamente.
Dman2

Questo NON funziona in generale. Gli assi sono uguali, ma il grafico non è quadrato, a meno che anche la finestra di stampa non sia quadrata. Testato con Matplotlib 2.0
divenex

P.axis('equal')sembra essere come P.gca().set_aspect('equal', adjustable='datalim'). Mentre se adjustable='box', allora la trama diventa quadrata.
Evgeni Sergeev

Sicuramente non ne ricavo una scatola quadrata.
Peter Drake

pylab è obsoleto
eric il

19

Vedere la documentazione su plt.axis(). Questo:

plt.axis('equal')

non funziona perché cambia i limiti dell'asse per far sembrare circolari i cerchi. Quello che vuoi è:

plt.axis('square')

Questo crea un grafico quadrato con assi uguali.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.