viele Rechtecke plotten

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Martenkowski
User
Beiträge: 10
Registriert: Dienstag 18. Juni 2019, 16:11

Moin,
ich habe Listen mit x und y Koordinaten von Punkten, die ich als Rechtecke plotten möchte.

Ich habe folgende Funktion gefunden:

Code: Alles auswählen

fig1 = plt.figure()
ax1 = fig1.add_subplot(111, aspect='equal')
ax1.add_patch(
    patches.Rectangle((0, 0), width, height))
plt.ylim(lims)
plt.xlim(lims)
width, height und lims wären dann irgendwelche Daten.

Mein Problem ist nun, dass ich damit ja nur ein Rechteck erzeuge. Ich brauche aber viele. Ich dachte jetzt, dass es naheliegend wäre, an die Stelle wo nun (0,0) für die Koordinaten steht einfach meine Listen mit x und y Koordinaten zu packen und dachte, dass er dann statt einem Rechteck eben ganz viele macht.
Bevor ich jetzt jedes Rechteck einzeln schreibe, wollte ich mal fragen, wie man das so schreibt, dass er sich die Koordinaten aus den Listen rausholt.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

mit einer Schleife.
Martenkowski
User
Beiträge: 10
Registriert: Dienstag 18. Juni 2019, 16:11

Sirius3 hat geschrieben: Samstag 22. Juni 2019, 17:40 mit einer Schleife.
Ich habe das jetzt mit so einer Funktion gemacht:

Code: Alles auswählen

n = len(PosDis1)
for i in range(0,n):
    x = PosDis1x[i]
    y = PosDis1y[i]
    ax.add_patch(matplotlib.patches.Rectangle((x, y),10,10))
Ist das eine Schleife? Funktioniert auf jeden Fall.
Ich war bei R gewohnt an Stelle von x und y einfach Vektoren anzugeben, daher stand ich auf dem Schlauch anfangs.
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Statt die Koordinaten in zwei Listen zu speichern, macht man das in Tupeln in nur einer. Und spart sich viel Code.

Code: Alles auswählen

coords = [(10, 20), (40, 50)]
for x, y in coords:
       print(x, y)
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Warum gibt es ein PosDis1, und ein PosDis1x/y?
Wie man es richtig macht, hat __deets__ ja schon gezeigt. Daneben solltest Du Dir sinnvolle Variablennamen ausdenken. ›Pos‹ ist ja noch eine recht allgemeine Abkürzung für Position, aber was soll ›Dis‹ bedeuten. Nach Konvention werden Variablen klein_mit_unterstrich geschrieben. Zusammengehörige Daten gehören in eine Datenstruktur, hier wahrscheinlich eine n x 2-Numpy-Array oder irgendwas von Pandas.
Über einen Index iteriert man in Python nie, weil man direkt über die Elemente iterieren kann.
Benutzeravatar
__blackjack__
User
Beiträge: 13080
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Und nur zur Sicherheit die Nachfrage: Du möchtest nicht eigentlich einen Scatterplot haben und implementierst den jetzt unnötigerweise selbst‽
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Martenkowski
User
Beiträge: 10
Registriert: Dienstag 18. Juni 2019, 16:11

Sirius3 hat geschrieben: Sonntag 23. Juni 2019, 11:47 Warum gibt es ein PosDis1, und ein PosDis1x/y?
Wie man es richtig macht, hat __deets__ ja schon gezeigt. Daneben solltest Du Dir sinnvolle Variablennamen ausdenken. ›Pos‹ ist ja noch eine recht allgemeine Abkürzung für Position, aber was soll ›Dis‹ bedeuten. Nach Konvention werden Variablen klein_mit_unterstrich geschrieben. Zusammengehörige Daten gehören in eine Datenstruktur, hier wahrscheinlich eine n x 2-Numpy-Array oder irgendwas von Pandas.
Über einen Index iteriert man in Python nie, weil man direkt über die Elemente iterieren kann.
Das werden Suchbilder. Ein Targetobjekt soll zwischen verschiedenen Distraktoren gesucht werden. Ich habe eine gewisse Anzahl randomisierter Werte und davon soll eines ein Targetobjekt werden und andere werden zu unterschiedlichen Distraktoren. PosDis1 ist z.B. einfach eine Liste mit der ich aus der Gesamtliste diejenigen Punkte auswähle, die die dann auf dem Diagramm als eine bestimmte Rechteckform dargestellt werden sollen. Die Distraktorentypen unterscheiden sich in Größe und Farbe.
Das kann jemand, der sich mit Python auskennt sicher alles effizienter programmieren, mich interessiert aber gerade nur das Resultat.

Es ist auch schon fertig jetzt. Trotzdem vielen Dank für die Verbesserungstipps.
Antworten