Wie werden die Skalen der x-Achse und der y-Achse in Python matplotlib ausgeglichen?

127

Ich möchte Linien auf einem quadratischen Diagramm zeichnen.

Die Skalen von x-axisund y-axissollten gleich sein.

zB x reicht von 0 bis 10 und es ist 10 cm auf dem Bildschirm. y muss ebenfalls zwischen 0 und 10 liegen und 10 cm betragen.

Die quadratische Form muss beibehalten werden, auch wenn ich mit der Fenstergröße herumspiele.

Derzeit skaliert mein Diagramm zusammen mit der Fenstergröße.

Wie kann ich das erreichen?

AKTUALISIEREN:

Ich habe Folgendes versucht, aber es hat nicht funktioniert.

plt.xlim(-3, 3)
plt.ylim(-3, 3)
plt.axis('equal')
Sibbs Glücksspiel
quelle
Es funktioniert für mich. Können Sie ein ganzes Codebeispiel posten, das nicht funktioniert? Und können Sie erklären, was nicht funktioniert? Willst du nur die Samenskala? Oder auch die gleiche Reichweite?
Joris
1
@joris Grundsätzlich möchte ich ein festes SQUARE-Diagramm. Selbst wenn ich das Fenster maximiere, hoffe ich, dass das QUADRAT reserviert ist. Mein Bildschirm ist breit. Nachdem ich das Fenster maximiert habe, wird das Diagramm ebenfalls rechteckig. Ich möchte, dass es immer noch QUADRATISCH ist
Sibbs Gambling
Auch hier können Sie ein vollständiges Codebeispiel veröffentlichen. Da die gegebene Antwort dies tun sollte, bewahren Sie sie als Quadrat auf. Bewahren Sie nicht die Breite oder Höhe, sondern die Form.
Joris
1
Bitte versuchen Sie, bei der Interaktion mit anderen auf SO etwas weniger aggressiv zu sein. Sie bekommen Hilfe aus der Freundlichkeit der Menschen, also handeln Sie etwas weniger berechtigt.
Tacaswell
Für 3D müssen Sie ein wenig zusätzliche Arbeit leisten: stackoverflow.com/questions/13685386/…
Trevor Boyd Smith

Antworten:

177

Sie müssen etwas tiefer in die API graben, um dies zu tun:

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 für set_aspect

Tacaswell
quelle
4
Genial! Es funktioniert in der Tat wie Charme. Könnten Sie mir bitte sagen, was plt.plot(range(5))und was Sie plt.gca().set_aspect('equal', adjustable='box')tun sollen, wenn es Ihnen nichts ausmacht? Außerdem stelle ich fest, dass plt.draw()die Handlung auch dann angezeigt wird, wenn ich sie nicht habe . Was nützt es dann?
Sibbs Gambling
Das plotist nur etwas zu zeigen. Für das set_aspectLesen der Dokumentation Link. Das drawist nur, um sicherzustellen, dass es gerendert wird.
Tacaswell
Tut mir leid, aber ich frage nach dem Bereich (5) in plot (). Was macht der Bereich (5)?
Sibbs Gambling
1
@ perfektion1 keine Sorge, ich habe eine Weile gebraucht, um herauszufinden, was Sie gefragt haben.
Tacaswell
1
Gibt es eine Möglichkeit, dies zu erreichen, ohne die Grenzwerte genau angeben zu müssen? Ich hätte erwartet, dass es einen einfachen Befehl gibt, um ein quadratisches Diagramm mit demselben Maßstab und denselben Häkchen für beide Achsen zu erhalten. Danke
Verwirrt
69
plt.axis('scaled')

funktioniert gut für mich.

myx
quelle
Arbeitete auch für mich. Stellen Sie einfach sicher, dass Sie dies verwenden, bevor Sie Grenzwerte / Ticks festlegen, da dies automatisch neu skaliert wird.
Andrew
3
Entschuldigung, plt.axis ('skaliert') hat in Python 3.7 und matplotlib nicht funktioniert - matplotlib == 3.1.0 Allerdings hat plt.axis ('square') funktioniert!
Rishi Jain
18

Versuchen Sie etwas wie:

import pylab as p
p.plot(x,y)
p.axis('equal')
p.show()
Dman2
quelle
Dies funktioniert auf meinem System. Vielleicht könnten Sie einen Teil des Codes anzeigen, an dem Sie arbeiten? Könnte helfen, das Problem schneller zu lösen.
Dman2
Dies funktioniert im Allgemeinen NICHT. Die Achsen sind gleich, aber der Plot ist nicht quadratisch, es sei denn, das Plotfenster ist ebenfalls quadratisch. Getestet mit Matplotlib 2.0
Divenex
P.axis('equal')scheint zu sein P.gca().set_aspect('equal', adjustable='datalim'). Während wenn adjustable='box', dann wird die Handlung quadratisch.
Evgeni Sergeev
Ich auf jeden Fall tun nicht bekommen eine quadratische Box raus.
Peter Drake
pylab ist veraltet
eric
17

Siehe die Dokumentation zu plt.axis(). Dies:

plt.axis('equal')

funktioniert nicht, weil es die Grenzen der Achse ändert, um Kreise kreisförmig erscheinen zu lassen. Was Sie wollen ist:

plt.axis('square')

Dadurch wird ein quadratisches Diagramm mit gleichen Achsen erstellt.

Adam Stewart
quelle