Jak wyrównać skale osi X i osi Y w Python matplotlib?

128

Chciałbym narysować linie na kwadratowym wykresie.

Skale x-axisi y-axispowinny być takie same.

np. x wynosi od 0 do 10, a na ekranie wynosi 10 cm. y również musi mieścić się w zakresie od 0 do 10, a także 10 cm.

Kwadratowy kształt musi zostać zachowany, nawet jeśli będę bawić się rozmiarem okna.

Obecnie mój wykres skaluje się wraz z rozmiarem okna.

Jak mogę to osiągnąć?

AKTUALIZACJA:

Wypróbowałem następujące, ale nie zadziałało.

plt.xlim(-3, 3)
plt.ylim(-3, 3)
plt.axis('equal')
Sibbs Hazard
źródło
To działa dla mnie. Czy możesz opublikować cały przykład kodu, który nie działa? Czy możesz wyjaśnić, co nie działa? Czy chcesz tylko samen? Czy też ten sam zakres?
joris
1
@joris w zasadzie chcę mieć stały wykres KWADRATOWY. Nawet jeśli zmaksymalizuję okno, mam nadzieję, że KWADRAT jest zarezerwowany. Mój ekran jest szeroki, po zmaksymalizowaniu okna wykres również staje się prostokątny. Chcę, żeby nadal był SQUARE
Sibbs Gambling
Ponownie, czy możesz opublikować pełny przykład kodu. Ponieważ podana odpowiedź powinna to zrobić, zachowaj ją jako kwadrat. Nie zachowuj jego szerokości ani wysokości, ale zachowaj jego kształt.
joris
2
Podczas interakcji z innymi osobami na SO staraj się być nieco mniej szorstki. Otrzymujesz pomoc z ludzkiej dobroci, więc zachowuj się trochę mniej uprawnie.
tacaswell
w przypadku 3d, musisz wykonać trochę dodatkowej pracy: stackoverflow.com/questions/13685386/…
Trevor Boyd Smith

Odpowiedzi:

179

Aby to zrobić, musisz głębiej zagłębić się w interfejs API:

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

tacaswell
źródło
4
Niesamowite! To rzeczywiście działa jak urok. Czy mógłbyś mi powiedzieć, co plt.plot(range(5))i plt.gca().set_aspect('equal', adjustable='box')zrobić, jeśli nie masz nic przeciwko? Zauważyłem też, że nawet jeśli tego nie zrobię plt.draw(), fabuła się pojawi. Więc jaki jest pożytek z tego?
Sibbs Gambling
po plotprostu mają coś do pokazania. Aby set_aspectodczytać link dokumentacji. Ma drawto na celu upewnienie się, że zostanie wyrenderowane.
tacaswell
1
aby mieć jakieś fałszywe dane do wykreślenia (powinno było nakreślić linię prostą).
tacaswell
1
@ perfectionm1ng bez obaw, zajęło mi trochę czasu, zanim zrozumiałem, o co prosisz.
tacaswell
1
Czy istnieje sposób, aby to zrobić bez konieczności dokładnego określania limitów? Spodziewałbym się, że pojawi się proste polecenie, aby uzyskać kwadratowy wykres z tą samą skalą i znacznikami dla obu osi. Dzięki
Zakłopotany
70
plt.axis('scaled')

działa dobrze dla mnie.

myx
źródło
Pracował też dla mnie. Po prostu upewnij się, że używasz tego przed ustawieniem limitów / taktów, ponieważ skaluje się automatycznie.
Andrew,
3
Przepraszamy, plt.axis ('scaled') nie działało dla mnie w Pythonie 3.7 i matplotlib - matplotlib == 3.1.0 Jednak plt.axis ('square') działało!
rishi jain
19

Spróbuj czegoś takiego:

import pylab as p
p.plot(x,y)
p.axis('equal')
p.show()
Dman2
źródło
To działa w moim systemie, może mógłbyś pokazać część kodu, nad którym pracujesz? Może być w stanie pomóc szybciej rozwiązać problem.
Dman2
To ogólnie NIE działa. Osie są równe, ale wykres nie jest kwadratowy, chyba że okno kreślenia jest również kwadratowe. Testowane z Matplotlib 2.0
divenex
P.axis('equal')wydaje się być jak P.gca().set_aspect('equal', adjustable='datalim'). Jeśli adjustable='box', to wykres staje się kwadratowy.
Evgeni Sergeev
Zdecydowanie nie dostaję z tego kwadratowego pudełka.
Peter Drake
Pylab jest przestarzały
eric
19

Zobacz dokumentację na plt.axis(). To:

plt.axis('equal')

nie działa, ponieważ zmienia granice osi, aby okręgi wyglądały na okrągłe. Chcesz:

plt.axis('square')

Tworzy to kwadratowy wykres z równymi osiami.

Adam Stewart
źródło