Wykreślanie listy współrzędnych (x, y) w pythonie matplotlib

110

Mam listę par, (a, b)które chciałbym narysować matplotlibw Pythonie jako rzeczywiste współrzędne xy. Obecnie tworzy dwa wykresy, gdzie indeks listy podaje współrzędną x, a wartości y pierwszego wykresu to as w parach, a wartości y na drugim wykresie to bs w parach.

Aby wyjaśnić, moje dane wyglądają następująco: li = [(a,b), (c,d), ... , (t, u)] chcę zrobić jednolinijkowy, który po prostu nazywa plt.plot()niepoprawne. Gdybym nie potrzebował jednej linijki, mógłbym w trywialny sposób zrobić:

xs = [x[0] for x in li]
ys = [x[1] for x in li]
plt.plot(xs, ys)

Jak mogę zmusić matplotlib do wykreślenia tych par jako współrzędnych xy?

CodeKingPlusPlus
źródło

Odpowiedzi:

180

Jak na tym przykładzie :

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

będzie produkować:

wprowadź opis obrazu tutaj

Aby rozpakować dane z par na listy, użyj zip:

x, y = zip(*li)

Tak więc jednowierszowy:

plt.scatter(*zip(*li))
sashkello
źródło
7
Dla 2-kolumnowej tablicy numpy plt.scatter( * xy.T )działa: krótkie i niejasne dlax, y = xy.T; plt.scatter( x, y )
denis
2
x, y = zip(*li)to naprawdę elegancki kod w Pythonie! robiłem bardziej proste dwa wiersze kodu z kompresją listy w każdym wierszu (jak w oryginalnym pytaniu)
Trevor Boyd Smith
1
To trochę mylące, co losowy plt.scatterprzykład ma wspólnego z pytaniem.
jamesdlin
36

Jeśli masz tablicę numpy, możesz to zrobić:

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
źródło
1
Więc nie ma sposobu, aby mieć np.arrayof data=np.array([[x1,y1],[x2,y2],etc.])i using plt.plot(data). Zawsze będę musiał podawać dwie tablice zamiast tablic tablic?
Max Coplan,
1
@MaxCoplan, zgadza się, ale możesz użyć tego, plt.plot(*data.T)który robi to samo, co powyżej, ale pomija krok pośredni.
Zweedeend
7

Jeśli chcesz narysować pojedynczą linię łączącą wszystkie punkty na liście

plt . plot ( li [ : ] )

plt . show ( )

Spowoduje to wykreślenie linii łączącej wszystkie pary na liście jako punkty na płaszczyźnie kartezjańskiej od początku listy do końca. Mam nadzieję, że tego właśnie chciałeś.

Shubham Rana
źródło
3
Nie chciał kreślić jednej linii, chciał kreślić z „jedną linijką” (pojedynczą linijką kodu). Odpowiedzią, której szukał (i uzyskał 3 lata temu) było użycie scatter().
Dartmouth
8
Skoro ta odpowiedź określa warunek, w jakim działa, tj. „Jeśli chcesz wykreślić jedną linię łączącą wszystkie punkty na liście”, czy naprawdę zasługuje na negatywną ocenę?
Gathide