Zeichnen einer Liste von (x, y) -Koordinaten in Python Matplotlib

109

Ich habe eine Liste von Paaren (a, b), mit denen ich matplotlibin Python als tatsächliche xy-Koordinaten zeichnen möchte . Derzeit werden zwei Diagramme erstellt, wobei der Index der Liste die x-Koordinate angibt und die y-Werte des ersten Diagramms die as in den Paaren und die y-Werte des zweiten Diagramms die bs in den Paaren sind.

Zur Verdeutlichung sehen meine Daten folgendermaßen aus: li = [(a,b), (c,d), ... , (t, u)] Ich möchte einen Einzeiler erstellen , der nur plt.plot()falsch aufruft . Wenn ich keinen Einzeiler benötige, könnte ich das trivial tun:

xs = [x[0] for x in li]
ys = [x[1] for x in li]
plt.plot(xs, ys)
  • Wie kann ich matplotlib dazu bringen, diese Paare als xy-Koordinaten zu zeichnen?

Danke für all die Hilfe!

CodeKingPlusPlus
quelle

Antworten:

180

Wie in diesem Beispiel :

import numpy as np
import matplotlib.pyplot as plt

N = 50
x = np.random.rand(N)
y = np.random.rand(N)

plt.scatter(x, y)
plt.show()

wird herstellen:

Geben Sie hier die Bildbeschreibung ein

Um Ihre Daten von Paaren in Listen zu entpacken, verwenden Sie zip:

x, y = zip(*li)

Also der Einzeiler:

plt.scatter(*zip(*li))
Sashkello
quelle
7
Für ein 2-Spalten-Numpy-Array plt.scatter( * xy.T )funktioniert: kurz und dunkel fürx, y = xy.T; plt.scatter( x, y )
denis
2
x, y = zip(*li)ist wirklich eleganter Python-Code! Ich habe die direkteren zwei Codezeilen mit einer Listenkomprimierung in jeder Zeile (wie die ursprüngliche Frage) gemacht
Trevor Boyd Smith
1
Es ist etwas verwirrend, was das zufällige plt.scatterBeispiel mit der Frage zu tun hat.
Jamesdlin
35

Wenn Sie ein Numpy-Array haben, können Sie dies tun:

import numpy as np
from matplotlib import pyplot as plt

data = np.array([
    [1, 2],
    [2, 3],
    [3, 6],
])
x, y = data.T
plt.scatter(x,y)
plt.show()
Zweedeend
quelle
1
Es gibt also keine Möglichkeit, ein np.arrayvon data=np.array([[x1,y1],[x2,y2],etc.])und zu verwenden plt.plot(data). Ich muss immer zwei Arrays anstelle von Arrays von Arrays geben?
Max Coplan
1
@ MaxCoplan, das ist richtig, aber Sie könnten verwenden, plt.plot(*data.T)was das gleiche wie oben tut, aber den Zwischenschritt überspringt.
Zweedeend
5

Wenn Sie eine einzelne Linie zeichnen möchten, die alle Punkte in der Liste verbindet

plt . plot ( li [ : ] )

plt . show ( )

Dadurch wird eine Linie gezeichnet, die alle Paare in der Liste als Punkte auf einer kartesischen Ebene vom Anfang der Liste bis zum Ende verbindet. Ich hoffe, dass Sie das wollten.

Shubham Rana
quelle
3
Er wollte keine einzelne Zeile zeichnen, er wollte mit einem "Einzeiler" (einer einzelnen Codezeile) zeichnen. Die Antwort, die er suchte (und vor 3 Jahren bekam), war zu verwenden scatter().
Dartmouth
7
Da diese Antwort die Bedingung angibt, unter der sie funktioniert, dh "Wenn Sie eine einzelne Linie zeichnen möchten, die alle Punkte in der Liste verbindet", verdient sie wirklich eine Abwertung?
Gathide