HOWTO · Matplotlib

Connetti i punti del grafico a dispersione con la linea in Matplotlib

Collega i punti del grafico a dispersione di Matplotlib in ordine di dati con `plot()`, imposta lo stile della linea e controlla quale livello appare in primo piano con `zorder`.

In questa pagina

Per collegare i punti del grafico a dispersione nell’ordine dei dati, passa gli stessi valori x e y a scatter() e plot(), quindi chiama show() per visualizzare la figura. scatter() disegna i marcatori come una raccolta indipendente, plot() disegna il percorso che collega i punti nell’ordine fornito e show() mostra la figura completata.

Gli esempi di questo tutorial sono stati eseguiti e verificati con Matplotlib 3.11.2 su Python 3.12, e ogni figura qui sotto è il risultato renderizzato dell’esempio immediatamente soprastante.

Collegare i punti del grafico a dispersione in ordine di dati con scatter() e plot()

Fornisci a entrambe le funzioni le stesse sequenze di coordinate. plot() collega ogni coppia nell’ordine fornito, quindi è la sequenza a determinare il percorso; Matplotlib non ordina i punti per coordinata x. Mantieni ogni valore x accoppiato al suo valore y corrispondente: il primo valore x appartiene al primo valore y, il secondo al secondo, e così via. Se ordini le osservazioni per x, riordina i valori y insieme a quelle stesse osservazioni invece di ordinare le due liste in modo indipendente.

Questo è importante quando i dati rappresentano un percorso, una serie temporale o un’altra sequenza in cui l’ordine ha un significato. Ad esempio, valori x che passano da 1 a 3 e poi tornano a 2 producono un percorso che si sposta a destra e poi a sinistra. Per una traiettoria questo può essere corretto. Se invece il tuo obiettivo è una curva che procede da sinistra a destra, ordina prima le osservazioni accoppiate. Una linea può contenere anche segmenti verticali quando osservazioni adiacenti condividono un valore x; plot() le collega comunque nell’ordine fornito.

Questo esempio sovrappone i marcatori e la linea di collegamento usando un unico insieme di coordinate:

import matplotlib.pyplot as plt

x = [1, 2, 3, 4]
y = [2, 1, 3, 2]

plt.scatter(x, y)
plt.plot(x, y)
plt.xlabel("x")
plt.ylabel("y")
plt.show()

Quattro punti del grafico a dispersione in (1, 2), (2, 1), (3, 3) e (4, 2) collegati in ordine di dati da una linea continua.

Usare gli stessi input x e y mantiene marcatori e linea allineati. Se i due livelli appaiono sfalsati, controlla che nessuna delle due sequenze sia stata trasformata o riordinata per una sola chiamata. Per dati memorizzati in una tabella, seleziona entrambe le colonne dalle stesse righe e nello stesso ordine. L’esempio usa l’interfaccia pyplot, quindi non ha bisogno di una variabile figura separata; con l’interfaccia orientata agli oggetti, crea una figura e degli assi con fig, ax = plt.subplots(), quindi chiama ax.scatter(...) e ax.plot(...) su quegli assi.

Impostare lo stile di linea e marcatori con plot()

Usa linestyle e color per impostare lo stile del percorso disegnato da plot(). L’esempio successivo mantiene un livello scatter() separato per i marcatori e disegna il percorso di collegamento come una linea blu tratteggiata:

import matplotlib.pyplot as plt

x = [1, 2, 3, 4]
y = [2, 1, 3, 2]

plt.scatter(x, y, color="blue")
plt.plot(x, y, linestyle="--", color="blue")
plt.xlabel("x")
plt.ylabel("y")
plt.show()

Gli stessi quattro punti collegati da una linea blu tratteggiata, con un marcatore blu in ogni punto.

Chiamare scatter() e plot() separatamente offre un controllo indipendente sulla raccolta di punti e sul percorso di collegamento: dimensione e colore dei marcatori possono cambiare senza toccare la linea, il che è utile quando i punti devono risaltare di più mentre il percorso resta visivamente semplice. Fornisci a entrambe le chiamate le stesse sequenze di coordinate, in modo che ogni marcatore si trovi sul suo punto corrispondente nella linea.

Una singola chiamata a plot() può anche disegnare entrambi i livelli in una volta tramite una stringa di formato come "xb-", dove x seleziona la forma del marcatore, b seleziona il blu e - seleziona una linea continua. La stringa di formato è compatta quando una sola chiamata deve disegnare tutto; argomenti con parola chiave come color, marker e linestyle sono più chiari quando servono altre proprietà, come la dimensione del marcatore, lo spessore della linea o la trasparenza. Qualunque approccio tu scelga, show() va dopo tutte le chiamate di stile e di livello, perché mostra la figura solo dopo che quegli elementi sono stati aggiunti.

Controllare quale livello appare in primo piano con zorder

L’elemento con lo zorder più alto viene disegnato sopra quello con il valore più basso. Questo cambia solo l’ordine di disegno; non cambia le coordinate né il percorso. L’impostazione è importante quando una linea spessa attraversa un marcatore e ne nasconde il centro, o quando la linea deve restare visibile in mezzo a marcatori fitti.

L’esempio successivo rende la linea deliberatamente spessa e assegna ai marcatori lo zorder più alto, così ogni marcatore rotondo resta intero nel punto in cui la linea gli passa sotto:

import matplotlib.pyplot as plt

x = [1, 2, 3, 4]
y = [2, 1, 3, 2]

plt.plot(x, y, linewidth=6, zorder=2)
plt.scatter(x, y, s=120, zorder=3)
plt.xlabel("x")
plt.ylabel("y")
plt.show()

Una linea spessa attraverso i quattro punti, con marcatori rotondi più grandi disegnati sopra la linea in ogni punto.

Per avere i marcatori sopra la linea, assegna alla raccolta di dispersione il valore maggiore, come zorder=3 per scatter() contro zorder=2 per plot() nell’esempio sopra. Per mettere la linea sopra i marcatori, inverti i valori. Usa una differenza modesta tra i due valori per esprimere l’ordine desiderato, e imposta zorder su entrambi gli elementi quando la sovrapposizione deve essere inequivocabile. Lo stesso confronto vale per qualsiasi altro elemento del grafico aggiunto in seguito: l’elemento con lo zorder più alto viene disegnato sopra gli altri.

Uniformare le lunghezze di x e y per evitare l’errore di dimensione

Entrambe le funzioni accoppiano i valori posizione per posizione, quindi le due sequenze devono avere la stessa lunghezza. In caso contrario, la chiamata solleva un ValueError e non viene disegnata alcuna figura. Questo esempio omette per errore l’ultimo valore y:

import matplotlib.pyplot as plt

x = [1, 2, 3, 4]
y = [2, 1, 3]

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

La sua esecuzione fallisce alla chiamata scatter() con:

ValueError: x and y must be the same size

Anche chiamare solo plot() con gli stessi input fallisce, con la sua formulazione dello stesso problema: ValueError: x and y must have same first dimension, but have shapes (4,) and (3,). Per correggere l’errore, individua l’osservazione mancante o in eccesso e fai in modo che le due sequenze descrivano di nuovo gli stessi punti. Confrontare len(x) e len(y) prima di disegnare indica quale lato è più corto. Quando i dati provengono da una tabella, filtra le righe una sola volta e poi prendi entrambe le colonne dalle righe filtrate, invece di filtrare ogni colonna separatamente lasciando che le loro lunghezze divergano.

Due sequenze vuote sono un caso diverso: vengono accettate e producono un insieme di assi vuoto senza errori. Una figura vuota quindi di solito significa che i dati di input erano vuoti, non che le lunghezze non corrispondessero.