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')

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


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.


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()

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.