Introduzione
Quando si lavora con dati reali, molto spesso non si hanno semplici numeri su un asse X, ma date e orari: vendite giornaliere, sensori IoT, traffico web, temperature registrate ogni ora, log applicativi, e così via. In questi casi, Matplotlib offre strumenti molto utili per creare grafici leggibili e professionali con un asse temporale ben formattato.
Questo tutorial si concentra su un sotto-argomento pratico e fondamentale: la visualizzazione di serie temporali con date, formattazione dell’asse e gestione del tempo. Vedremo come usare datetime insieme a Matplotlib per produrre grafici chiari, con etichette automatiche, rotazione dei tick e formattazione delle date.
L’obiettivo non è solo “disegnare una linea”, ma imparare a presentare i dati temporali in modo efficace, evitando grafici confusi o difficili da leggere.
Codice completo
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from datetime import datetime, timedelta
# Dati di esempio: vendite giornaliere di un piccolo e-commerce
date_inizio = datetime(2024, 3, 1)
date = [date_inizio + timedelta(days=i) for i in range(14)]
vendite = [120, 135, 128, 150, 160, 155, 170, 180, 175, 190, 200, 195, 210, 220]
# Creazione del grafico
fig, ax = plt.subplots(figsize=(10, 5))
ax.plot(date, vendite, marker=´o´, linewidth=2, color=´steelblue´)
# Titolo e etichette
ax.set_title("Andamento delle vendite giornaliere", fontsize=14)
ax.set_xlabel("Data")
ax.set_ylabel("Vendite")
# Formattazione dell´asse X con date leggibili
ax.xaxis.set_major_locator(mdates.DayLocator(interval=2))
ax.xaxis.set_major_formatter(mdates.DateFormatter("%d %b"))
# Ruota le etichette per migliorare la leggibilità
plt.xticks(rotation=45)
# Griglia leggera
ax.grid(True, linestyle=´--´, alpha=0.4)
# Aggiunge un margine per evitare che i punti tocchino i bordi
ax.margins(x=0.02)
plt.tight_layout()
plt.show() Spiegazione
Il punto chiave di questo esempio è l’uso di oggetti datetime come valori dell’asse X. Matplotlib li gestisce molto bene, ma per ottenere un risultato davvero leggibile conviene usare il modulo matplotlib.dates, che fornisce strumenti specifici per i grafici temporali.
1. Creazione delle date
Abbiamo definito una data iniziale con datetime(2024, 3, 1) e poi generato una lista di 14 giorni consecutivi usando timedelta(days=i). Questo approccio è molto utile quando vuoi simulare dati giornalieri o quando i dati arrivano da una sorgente già ordinata nel tempo.
2. Disegno della linea
La chiamata ax.plot(date, vendite, ...) crea un grafico a linea classico. L’elemento interessante è che l’asse X non contiene numeri, ma date. Matplotlib converte internamente questi valori e li posiziona correttamente lungo la scala temporale.
3. Formattazione dei tick temporali
Le due righe seguenti sono fondamentali:
ax.xaxis.set_major_locator(mdates.DayLocator(interval=2))
ax.xaxis.set_major_formatter(mdates.DateFormatter("%d %b")) La prima imposta la frequenza dei tick principali: in questo caso, uno ogni 2 giorni. La seconda decide come visualizzare la data. Il formato "%d %b" mostra il giorno e il mese abbreviato, ad esempio 01 Mar, 03 Mar, 05 Mar.
Se hai molte date, questa personalizzazione è essenziale per evitare un asse X sovraffollato.
4. Rotazione delle etichette
Con plt.xticks(rotation=45) ruotiamo le etichette per evitare sovrapposizioni. È una soluzione semplice ma molto efficace, specialmente quando le date sono lunghe o quando lo spazio orizzontale è limitato.
5. Miglioramento estetico
La griglia leggera con ax.grid(True, linestyle=´--´, alpha=0.4) aiuta a leggere meglio i valori, mentre ax.margins(x=0.02) evita che la linea tocchi i bordi del grafico. Infine, plt.tight_layout() riduce il rischio di sovrapposizioni tra titolo, etichette e tick.
Best practice
- Usa datetime nativi quando lavori con date: rendono il codice più chiaro e Matplotlib li gestisce bene.
- Non mostrare troppi tick sull’asse temporale. Se il grafico è affollato, riduci la frequenza con locators come DayLocator, HourLocator o MonthLocator.
- Adatta il formato alle informazioni utili: per dati giornalieri può bastare giorno e mese; per dati orari può essere utile mostrare ore e minuti.
- Ruota le etichette quando necessario, ma non esagerare: spesso 30° o 45° sono sufficienti.
- Usa colori coerenti e una griglia discreta per migliorare la leggibilità senza appesantire il grafico.
- Controlla sempre l’ordine cronologico dei dati. Una serie temporale non ordinata produce un grafico fuorviante.
- Evita formati di data troppo verbosi se il grafico deve essere letto rapidamente: la semplicità spesso è la scelta migliore.
Riepilogo
Visualizzare serie temporali con Matplotlib è una competenza molto utile per chi analizza dati reali. In questo tutorial hai visto come:
- creare una serie di date con datetime e timedelta;
- tracciare una linea con date sull’asse X;
- formattare i tick temporali con matplotlib.dates;
- migliorare leggibilità e presentazione con rotazione, griglia e layout automatico.
Il vantaggio principale di questo approccio è la chiarezza: un grafico temporale ben costruito permette di cogliere subito trend, picchi e anomalie. È una base solida per dashboard, report e analisi esplorative.
Approfondisci con risorse ufficiali
- Matplotlib - Pyplot tutorial: documentazione ufficiale per imparare l’uso base e intermedio dei grafici.
- Matplotlib dates API: riferimento ufficiale per locators, formatters e gestione delle date.
- Python datetime: documentazione standard per lavorare con date e orari in Python.
- Matplotlib gallery: raccolta di esempi ufficiali, molto utile per vedere casi d’uso reali e soluzioni grafiche.
