Visualizzare serie temporali con date e asse orario in Matplotlib

by theArchitect
SHARE
Visualizzare serie temporali con date e asse orario in Matplotlib
© Guida-HTML5.it

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.

SHARE