Un grafico a linee è una visualizzazione relazionale che mostra come varia una variabile continua al variare di un’altra. È uno dei grafici più comuni, ampiamente usato in finanza, vendite, marketing, sanità, scienze naturali e altro ancora.
In questo tutorial vedremo come usare Seaborn, una popolare libreria di visualizzazione dati per Python, per creare e personalizzare grafici a linee in Python.
Presentazione del dataset
Per avere qualcosa su cui esercitarci con i grafici a linee di seaborn, scaricheremo innanzitutto un dataset di Kaggle chiamato Daily Exchange Rates per Euro 1999-2024. Poi importeremo tutti i pacchetti necessari e leggeremo e puliremo il dataframe. Senza entrare nei dettagli del processo di pulizia, il codice qui sotto mostra i passaggi da eseguire:
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
daily_exchange_rate_df = pd.read_csv('euro-daily-hist_1999_2022.csv')
daily_exchange_rate_df = daily_exchange_rate_df.iloc[:, [0, 1, 4, -2]]
daily_exchange_rate_df.columns = ['Date', 'Australian dollar', 'Canadian dollar', 'US dollar']
daily_exchange_rate_df = pd.melt(daily_exchange_rate_df, id_vars='Date', value_vars=['Australian dollar', 'Canadian dollar', 'US dollar'], value_name='Euro rate', var_name='Currency')
daily_exchange_rate_df['Date'] = pd.to_datetime(daily_exchange_rate_df['Date'])
daily_exchange_rate_df = daily_exchange_rate_df[daily_exchange_rate_df['Date']>='2022-12-01'].reset_index(drop=True)
daily_exchange_rate_df['Euro rate'] = pd.to_numeric(daily_exchange_rate_df['Euro rate'])
print(f'Currencies: {daily_exchange_rate_df.Currency.unique()}\n')
print(df.head())
print(f'\n{daily_exchange_rate_df.Date.dt.date.min()}/{ daily_exchange_rate_df.Date.dt.date.max()}')
Output:
Currencies: ['Australian dollar' 'Canadian dollar' 'US dollar']
Date Currency Euro rate
0 2023-01-27 Australian dollar 1.5289
1 2023-01-26 Australian dollar 1.5308
2 2023-01-25 Australian dollar 1.5360
3 2023-01-24 Australian dollar 1.5470
4 2023-01-23 Australian dollar 1.5529
2022-12-01/2023-01-27
Il dataframe risultante contiene i tassi giornalieri (giorni lavorativi) dell’euro per dollaro australiano, canadese e statunitense nel periodo dal 01.12.2022 al 27.01.2023 inclusi.
Ora siamo pronti a entrare nel vivo e creare e personalizzare grafici a linee con seaborn in Python.
Nozioni di base sui grafici a linee in Seaborn
Per creare un grafico a linee in Seaborn, possiamo usare una delle due funzioni: lineplot() o relplot(). In generale, condividono molta funzionalità e gli stessi nomi dei parametri. La differenza principale è che relplot() consente di creare grafici a linee con più linee su diverse facet. Invece, lineplot() permette di lavorare con intervalli di confidenza e aggregazione dei dati.
In questo tutorial useremo principalmente la funzione lineplot().
Il corso Introduction to Data Visualization with Seaborn ti aiuterà a imparare e mettere in pratica le funzioni e i metodi principali della libreria seaborn. Puoi anche dare un’occhiata al nostro tutorial su Seaborn per principianti per familiarizzare con questa popolare libreria Python.
Creare un singolo grafico a linee con seaborn
Possiamo creare un grafico a linee che mostri la relazione tra due variabili continue come segue:
usd = daily_exchange_rate_df[daily_exchange_rate_df['Currency']=='US dollar'].reset_index(drop=True)
sns.lineplot(x='Date', y='Euro rate', data=usd)
Output:

Il grafico sopra mostra l’andamento del tasso EUR-USD. Abbiamo definito le variabili da tracciare sugli assi x e y (i parametri x e y) e il dataframe (data) da cui prelevarle.
Per confronto, per creare lo stesso grafico usando relplot(), scriveremmo quanto segue:
sns.relplot(x='Date', y='Euro rate', data=usd, kind='line')
Output:

In questo caso abbiamo passato un argomento in più specifico della funzione relplot(): kind='line'. Per impostazione predefinita, questa funzione crea uno scatter plot.
Personalizzare un singolo grafico a linee con seaborn
Possiamo personalizzare il grafico in molti modi per renderlo più leggibile e informativo. Ad esempio, possiamo modificare le dimensioni della figura, aggiungere titolo ed etichette degli assi, regolare la dimensione del font, personalizzare la linea, aggiungere e personalizzare i marker, ecc. Vediamo come implementare questi miglioramenti in seaborn.
Regolare le dimensioni della figura
Poiché Seaborn è costruito sopra matplotlib, possiamo usare matplotlib.pyplot per regolare le dimensioni della figura:
fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=usd)
Output:

Invece, con relplot(), possiamo usare i parametri height e aspect (il rapporto larghezza/altezza) per lo stesso scopo:
sns.relplot(x='Date', y='Euro rate', data=usd, kind='line', height=6, aspect=4)
Output:

Aggiungere un titolo e le etichette degli assi
Per aggiungere il titolo del grafico e le etichette degli assi, possiamo usare la funzione set() sull’oggetto del grafico a linee di seaborn passando gli argomenti title, xlabel e ylabel:
fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=usd).set(title='Euro-USD rate', xlabel='Date', ylabel='Rate')
Output:

Regolare la dimensione del font
Un modo comodo per regolare la dimensione del font è usare la funzione set_theme() e provare valori diversi del parametro font_scale:
fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=usd).set(title='Euro-USD rate', xlabel='Date', ylabel='Rate')
sns.set_theme(style='white', font_scale=3)
Output:

Nota che abbiamo anche aggiunto style='white' per evitare di sovrascrivere lo stile iniziale.
Cambiare colore, stile e spessore della linea
Per personalizzare la linea del grafico, possiamo passare alcuni parametri opzionali in comune con matplotlib.pyplot.plot, come color, linestyle o linewidth:
fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=usd, linestyle='dotted', color='magenta', linewidth=5).set(title='Euro-USD rate', xlabel='Date', ylabel='Rate')
sns.set_theme(style='white', font_scale=3)
Output:

Aggiungere marker e personalizzarne colore, stile e dimensione
È possibile aggiungere marker sulla linea e personalizzarne l’aspetto. Anche in questo caso possiamo usare alcuni parametri di matplotlib, come marker, markerfacecolor o markersize:
fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=usd, marker='*', markerfacecolor='limegreen', markersize=20).set(title='Euro-USD rate', xlabel='Date', ylabel='Rate')
sns.set_theme(style='white', font_scale=3)
Output:

La documentazione fornisce l’elenco completo dei parametri da usare per migliorare l’estetica di un grafico a linee in seaborn. In particolare, possiamo vedere tutte le scelte possibili di marker.
Nella nostra cheat sheet su Seaborn troverai altri modi per personalizzare un grafico a linee in Seaborn.
Grafici a linee Seaborn con più linee
Spesso dobbiamo esplorare come più variabili continue cambiano in funzione di un’altra variabile continua. A questo scopo possiamo costruire un grafico a linee di seaborn con più linee. Le funzioni lineplot() e relplot() si applicano anche a questi casi.
Creare un grafico a linee seaborn con più linee
Tecnicamente, è possibile creare un grafico a linee seaborn con più linee semplicemente costruendo un oggetto axes separato per ciascuna variabile dipendente, cioè ciascuna linea:
aud = daily_exchange_rate_df[daily_exchange_rate_df['Currency']=='Australian dollar'].reset_index(drop=True)
cad = daily_exchange_rate_df[daily_exchange_rate_df['Currency']=='Canadian dollar'].reset_index(drop=True)
sns.lineplot(x='Date', y='Euro rate', data=usd)
sns.lineplot(x='Date', y='Euro rate', data=aud)
sns.lineplot(x='Date', y='Euro rate', data=cad)
Output:

Qui sopra abbiamo estratto altri due sottoinsiemi dal dataframe iniziale daily_exchange_rate_df – per dollaro australiano e canadese – e tracciato ciascun tasso dell’euro nel tempo. Tuttavia, esistono soluzioni più efficienti: usare i parametri hue, style o size, disponibili sia in lineplot() che in relplot().
Usare il parametro hue
Questo parametro funziona così: gli assegniamo il nome di una colonna del dataframe contenente valori categoriali e seaborn genera un grafico a linee per ciascuna categoria, attribuendo un colore diverso a ogni linea:
sns.lineplot(x='Date', y='Euro rate', data=daily_exchange_rate_df, hue='Currency')
Output:

Con una sola riga di codice abbiamo creato un grafico a linee seaborn per tre categorie. Nota che abbiamo passato il dataframe iniziale daily_exchange_rate_df invece dei suoi sottoinsiemi per le diverse valute.
Usare il parametro style
Il parametro style funziona allo stesso modo di hue, solo che distingue le categorie usando stili di linea diversi (continua, tratteggiata, puntinata, ecc.), senza influire sul colore:
sns.lineplot(x='Date', y='Euro rate', data=daily_exchange_rate_df, style='Currency')
Output:

Usare il parametro size
Come hue e style, il parametro size crea una linea separata per ogni categoria. Non influisce su colore e stile delle linee ma ne rende ciascuna di larghezza diversa:
sns.lineplot(x='Date', y='Euro rate', data=daily_exchange_rate_df, size='Currency')
Output:

Personalizzare un grafico a linee seaborn con più linee
Ora sperimentiamo con l’estetica del nostro grafico. Alcune tecniche sono identiche a quelle applicate a un singolo grafico a linee Seaborn. Altre sono specifiche dei grafici a più linee.
Regolazioni generali
Possiamo regolare le dimensioni della figura, aggiungere un titolo e le etichette degli assi e cambiare la dimensione del font del grafico precedente allo stesso modo di quanto fatto per un singolo grafico a linee:
fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=daily_exchange_rate_df, hue='Currency').set(title='Euro rates for different currencies', xlabel='Date', ylabel='Rate')
sns.set_theme(style='white', font_scale=3)
Output:

Cambiare colore, stile e spessore di ogni linea
In precedenza abbiamo visto che, quando si usano i parametri hue, style o size, seaborn fornisce un set predefinito di colori/stili/spessori per un grafico a più linee. All’occorrenza possiamo ignorare questi default e scegliere noi colori/stili/spessori.
Quando usiamo il parametro hue, possiamo anche passare l’argomento palette come lista o tupla di nomi di colori di matplotlib. Ti consiglio di leggere il nostro tutorial, Seaborn Color Palette: Quick Guide to Picking Colors, per capire di più sulla teoria del colore e trovare tante buone idee per rendere le tue visualizzazioni più gradevoli.
fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=daily_exchange_rate_df, hue='Currency', palette=['magenta', 'deepskyblue', 'yellowgreen']).set(title='Euro rates for different currencies', xlabel='Date', ylabel='Rate')
sns.set_theme(style='white', font_scale=3)
Output:

È anche possibile applicare direttamente una palette di matplotlib esistente:
fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=daily_exchange_rate_df, hue='Currency', palette='spring').set(title='Euro rates for different currencies', xlabel='Date', ylabel='Rate')
sns.set_theme(style='white', font_scale=3)
Output:

Allo stesso tempo, usando hue, possiamo comunque regolare stile e spessore di tutte le linee passando gli argomenti linestyle e linewidth:
fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=daily_exchange_rate_df, hue='Currency', palette=['magenta', 'deepskyblue', 'yellowgreen'], linestyle='dashed', linewidth=5).set(title='Euro rates for different currencies', xlabel='Date', ylabel='Rate')
sns.set_theme(style='white', font_scale=3)
Output:

Invece, quando creiamo un grafico a linee seaborn con più linee usando il parametro style, possiamo assegnare una lista (o tupla) di liste (o tuple) a un parametro chiamato dashes:
fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=daily_exchange_rate_df, style='Currency', dashes=[[4, 4], [6, 1], [3, 9]]).set(title='Euro rates for different currencies', xlabel='Date', ylabel='Rate')
sns.set_theme(style='white', font_scale=3)
Output:

Nella lista di liste assegnata a dashes, il primo elemento di ogni sottolista rappresenta la lunghezza di un segmento della linea corrispondente, mentre il secondo elemento – la lunghezza di uno spazio.
Nota: per rappresentare una linea continua, dobbiamo impostare la lunghezza dello spazio a zero, ad es.: [1, 0].
Per regolare colore e spessore di tutte le linee di questo grafico, forniamo gli argomenti color e linewidth, proprio come quando abbiamo personalizzato un singolo grafico a linee seaborn:
fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=daily_exchange_rate_df, style='Currency', dashes=[[4, 4], [6, 1], [3, 9]], color='darkviolet', linewidth=4).set(title='Euro rates for different currencies', xlabel='Date', ylabel='Rate')
sns.set_theme(style='white', font_scale=3)
Output:

Infine, quando usiamo il parametro size per creare un grafico a più linee in seaborn, possiamo regolare lo spessore di ciascuna linea tramite il parametro sizes. Accetta una lista (o tupla) di interi:
fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=daily_exchange_rate_df, size='Currency', sizes=[2, 10, 5]).set(title='Euro rates for different currencies', xlabel='Date', ylabel='Rate')
sns.set_theme(style='white', font_scale=3)
Output:

Per personalizzare colore e stile di tutte le linee di questo grafico, dobbiamo fornire gli argomenti linestyle e color:
fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=daily_exchange_rate_df, size='Currency', sizes=[2, 10, 5], linestyle='dotted', color='teal').set(title='Euro rates for different currencies', xlabel='Date', ylabel='Rate')
sns.set_theme(style='white', font_scale=3)
Output:

Aggiungere marker e personalizzarne colore, stile e dimensione
Potremmo voler aggiungere marker al nostro grafico a più linee di seaborn.
Per aggiungere marker dello stesso colore, stile e dimensione su tutte le linee, dobbiamo usare i parametri di matplotlib, come marker, markerfacecolor, markersize, ecc., proprio come per un singolo grafico a linee:
fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=daily_exchange_rate_df, hue='Currency', marker='o', markerfacecolor='orangered', markersize=10).set(title='Euro rates for different currencies', xlabel='Date', ylabel='Rate')
sns.set_theme(style='white', font_scale=3)
Output:

Le cose cambiano, però, quando vogliamo marker diversi per ogni linea. In questo caso dobbiamo usare il parametro markers che, però, secondo le funzionalità di seaborn, funziona solo quando è specificato il parametro style:
fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=daily_exchange_rate_df, style='Currency', markers=['o', 'X', '*'], markerfacecolor='brown', markersize=10).set(title='Euro rates for different currencies', xlabel='Date', ylabel='Rate')
sns.set_theme(style='white', font_scale=3)
Output:

Nel grafico sopra, possiamo rendere tutte le linee continue fornendo l’argomento dashes e impostando il pattern [1, 0] per ciascuna linea:
fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=daily_exchange_rate_df, style='Currency', markers=['o', 'X', '*'], dashes=[[1, 0], [1, 0], [1, 0]], markerfacecolor='brown', markersize=10).set(title='Euro rates for different currencies', xlabel='Date', ylabel='Rate')
sns.set_theme(style='white', font_scale=3)
Output:

Conclusione
Ricapitolando, in questo tutorial abbiamo visto vari modi per creare e personalizzare un grafico a linee di Seaborn con una o più linee.
Come passi successivi, con seaborn possiamo fare molto di più per rifinire un grafico a linee. Ad esempio, possiamo:
- Raggruppare le linee in base a più di una variabile categoriale
- Personalizzare la legenda
- Creare grafici a linee con più linee su facet diverse
- Visualizzare e personalizzare l’intervallo di confidenza
- Personalizzare i tick e le etichette dell’asse temporale per un grafico a linee di serie storiche
Per approfondire cosa e come si può fare con seaborn, valuta di seguire il nostro corso Intermediate Data Visualization with Seaborn.
FAQ sui grafici a linee in Seaborn
Che cos’è un grafico a linee in Seaborn?
Un grafico a linee in Seaborn è un tipo di grafico che mostra la relazione tra due variabili collegando i punti dati con una linea retta.
Che tipo di dati è più adatto a un grafico a linee in Seaborn?
I grafici a linee sono più adatti a dati in cui c’è una chiara relazione tra due variabili e in cui le variabili sono continue o ordinali.
Posso tracciare più linee sullo stesso grafico in Seaborn?
Sì, puoi tracciare più linee sullo stesso grafico in Seaborn usando il parametro hue per specificare una variabile categoriale con cui raggruppare i dati.
Qual è la differenza tra un grafico a linee e uno scatter plot in Seaborn?
Un grafico a linee in Seaborn mostra la relazione tra due variabili con una linea retta, mentre uno scatter plot mostra la relazione con singoli punti dati.
Posso aggiungere una linea di regressione al mio grafico a linee in Seaborn?
Sì, puoi aggiungere una linea di regressione al tuo grafico a linee in Seaborn usando la funzione regplot(), che adatta e traccia un modello di regressione lineare tra due variabili.
Come salvo il mio grafico a linee di Seaborn su file?
Puoi salvare il tuo grafico a linee di Seaborn su file usando la funzione savefig() della libreria matplotlib, che salva la figura corrente in un percorso e formato specificati.

