Tracciare un elenco di coordinate (x, y) in python matplotlib


110

Ho un elenco di coppie con (a, b)cui vorrei tracciare matplotlibin Python come coordinate xy effettive. Attualmente, sta realizzando due grafici, in cui l'indice della lista fornisce la coordinata x, ei valori y del primo grafico sono le as nelle coppie e i valori y del secondo grafico sono le bs nelle coppie.

Per chiarire, i miei dati assomigliano a questo: li = [(a,b), (c,d), ... , (t, u)] voglio fare una battuta che chiama semplicemente plt.plot()errata. Se non avessi bisogno di una battuta potrei banalmente fare:

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

Come posso fare in modo che matplotlib stampi queste coppie come coordinate xy?

Risposte:


180

Secondo questo esempio :

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

produrrà:

inserisci qui la descrizione dell'immagine

Per decomprimere i dati dalle coppie in elenchi utilizzare zip:

x, y = zip(*li)

Quindi, la battuta:

plt.scatter(*zip(*li))

7
Per un array numpy a 2 colonne, plt.scatter( * xy.T )funziona: breve e oscuro perx, y = xy.T; plt.scatter( x, y )
denis

2
x, y = zip(*li)è davvero un elegante codice Python! ho fatto le due righe di codice più dirette con una compressione di elenco su ogni riga (come la domanda originale)
Trevor Boyd Smith

1
È un po 'confuso ciò che l' plt.scatteresempio casuale ha a che fare con la domanda.
jamesdlin

36

Se hai un array numpy puoi farlo:

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

1
Quindi non c'è modo di avere un np.arraydi data=np.array([[x1,y1],[x2,y2],etc.])e di usare plt.plot(data). Dovrò sempre dare due array invece di array di array?
Max Coplan

1
@ MaxCoplan, è vero, ma potresti usare plt.plot(*data.T)che fa lo stesso di sopra ma salta il passaggio intermedio.
Zweedeend

7

Se vuoi tracciare una singola linea che collega tutti i punti nell'elenco

plt . plot ( li [ : ] )

plt . show ( )

Questo traccerà una linea che collega tutte le coppie nell'elenco come punti su un piano cartesiano dall'inizio della lista alla fine. Spero che questo sia quello che volevi.


3
Non voleva tracciare una singola riga, voleva tracciare con un "one-liner" (una singola riga di codice). La risposta che stava cercando (e ha ottenuto 3 anni fa) era da usare scatter().
Dartmouth

8
Poiché questa risposta indica la condizione in cui funziona, ad esempio "Se vuoi tracciare una singola linea che collega tutti i punti della lista", merita davvero un voto negativo?
Gathide,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.