Grafici a linee con Matplotlib in Python — Guida completa
Impara a creare e personalizzare grafici a linee in Python con Matplotlib. Colori, stili, marcatori, linee multiple, annotazioni, riempimenti e salvataggio.
La funzione plot() di Matplotlib è lo strumento principale per i grafici a linee — grafici che collegano i punti dati con una linea continua per mostrare tendenze nel tempo o lungo una variabile continua. Questo capitolo copre tutto, dal primo grafico a onda sinusoidale fino a tocchi professionali come annotazioni, regioni ombreggiate e salvataggio di file pronti per la pubblicazione.
Prima di iniziare, assicurati che Matplotlib sia installato:
pip install matplotlibSe sei nuovo alla libreria, consulta prima i capitoli Introduzione a Matplotlib e Primi passi.
Quando usare un grafico a linee
Usa un grafico a linee quando:
- Vuoi mostrare tendenze nel tempo (prezzi azionari, temperatura nel corso dei mesi, perdita di addestramento nel corso delle epoche).
- L'asse x rappresenta una variabile continua o ordinata (tempo, distanza, frequenza).
- Devi confrontare serie multiple che condividono lo stesso asse x.
Evita i grafici a linee per categorie non ordinate — un grafico a barre è più chiaro in quel caso. Per la relazione tra due variabili numeriche indipendenti senza ordine implicito, considera invece un grafico a dispersione.
Creare un grafico a linee di base
La firma minimale è plt.plot(x, y). Sia x che y possono essere liste Python o array NumPy.
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100) # 100 evenly-spaced points from 0 to 10
y = np.sin(x)
plt.plot(x, y)
plt.xlabel('Time (s)')
plt.ylabel('Amplitude')
plt.title('Sine Wave')
plt.tight_layout()
plt.show()np.linspace(start, stop, num) restituisce num valori equidistanti — un modo comodo per generare curve morbide senza scrivere un ciclo. plt.tight_layout() regola la spaziatura in modo che le etichette degli assi non vengano mai tagliate; è buona abitudine includerla prima di ogni chiamata a show() o savefig().
Modificare il colore e lo stile della linea
Usare la stringa di formato abbreviata
Passa una stringa di formato '[colore][marcatore][stile_linea]' come terzo argomento posizionale:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.plot(x, y, 'r--') # red dashed line
plt.xlabel('x')
plt.ylabel('sin(x)')
plt.title('Red Dashed Sine Wave')
plt.tight_layout()
plt.show()Lettere di colore comuni: b blu, g verde, r rosso, c ciano, m magenta, y giallo, k nero, w bianco.
Codici di stile linea comuni: - continua (predefinita), -- tratteggiata, -. tratto-punto, : punteggiata.
Usare i parametri con nome
I parametri con nome sono più leggibili e offrono un controllo più preciso:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.plot(
x, y,
color='steelblue',
linestyle='--',
linewidth=2,
)
plt.xlabel('x')
plt.ylabel('sin(x)')
plt.title('Styled Line')
plt.tight_layout()
plt.show()| Parametro | Cosa controlla | Valori di esempio |
|---|---|---|
color | Colore della linea | 'red', '#3498db', (0.2, 0.6, 0.8) |
linestyle | Schema dei tratteggi | '-', '--', '-.', ':' |
linewidth | Spessore in punti | 1 (predefinito), 2, 3 |
alpha | Trasparenza 0–1 | 0.5 per 50% di opacità |
Aggiungere marcatori ai punti dati
I marcatori disegnano un simbolo in ogni punto dati, utile quando i dati grezzi hanno pochi punti e si vogliono mostrare esplicitamente.
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 2 * np.pi, 9) # only 9 points — markers are visible
y = np.sin(x)
plt.plot(
x, y,
color='darkorange',
linewidth=1.5,
marker='o', # circle marker
markersize=8,
markerfacecolor='white',
markeredgewidth=1.5,
)
plt.xlabel('x')
plt.ylabel('sin(x)')
plt.title('Sine Wave with Markers')
plt.tight_layout()
plt.show()Codici di marcatore comuni: 'o' cerchio, 's' quadrato, '^' triangolo verso l'alto, 'D' diamante, '+' più, 'x' croce, '*' stella.
Consulta il capitolo Marcatori di Matplotlib per l'elenco completo e le opzioni di formattazione avanzate.
Tracciare più linee
Chiama plt.plot() più di una volta prima di plt.show(). Ogni chiamata aggiunge una nuova linea agli stessi assi. Passa un argomento label e poi chiama plt.legend() per generare automaticamente una legenda.
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 200)
y1 = np.sin(x)
y2 = np.cos(x)
y3 = np.sin(x) * np.exp(-x / 5) # damped sine
plt.plot(x, y1, label='sin(x)', linewidth=1.5)
plt.plot(x, y2, label='cos(x)', linewidth=1.5, linestyle='--')
plt.plot(x, y3, label='damped sin(x)', linewidth=1.5, linestyle='-.')
plt.xlabel('x')
plt.ylabel('y')
plt.title('Multiple Lines')
plt.legend()
plt.tight_layout()
plt.show()Matplotlib scorre automaticamente la sua palette di colori predefinita, quindi non è necessario specificare colori diversi per ogni linea a meno che non si voglia sovrascriverli.
Controllare i limiti degli assi
plt.xlim() e plt.ylim() impostano l'intervallo visibile di ciascun asse. Passa (min, max) per ingrandire o rimpicciolire:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 200)
y = np.sin(x)
plt.plot(x, y)
plt.xlim(0, 5) # show only the first half
plt.ylim(-1.2, 1.2)
plt.xlabel('x')
plt.ylabel('sin(x)')
plt.title('Sine Wave (Zoomed In)')
plt.tight_layout()
plt.show()Per lasciare che Matplotlib determini automaticamente un limite mentre si fissa l'altro, usa None come segnaposto: plt.xlim(None, 5) lascia automatico il limite inferiore.
Aggiungere una griglia
plt.grid(True) aggiunge una griglia leggera che facilita la lettura dei valori nel grafico. Puoi puntare solo sui tick principali o secondari e controllare lo stile:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 200)
y = np.sin(x)
plt.plot(x, y, color='steelblue', linewidth=2)
plt.grid(True, linestyle='--', color='grey', alpha=0.5)
plt.xlabel('x')
plt.ylabel('sin(x)')
plt.title('Sine Wave with Grid')
plt.tight_layout()
plt.show()Consulta il capitolo Griglia di Matplotlib per una discussione completa sulla personalizzazione della griglia.
Annotare i punti
plt.annotate() disegna un'etichetta testuale con una freccia opzionale che punta a una specifica coordinata dei dati. È utile per evidenziare picchi, valli o eventi significativi.
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 200)
y = np.sin(x)
plt.plot(x, y, color='steelblue', linewidth=1.5)
# Annotate the first peak (approx. x = pi/2)
plt.annotate(
'peak',
xy=(np.pi / 2, 1), # point to annotate
xytext=(np.pi / 2 + 1, 1.1), # position of the text
arrowprops=dict(arrowstyle='->', color='black'),
fontsize=10,
)
plt.xlabel('x')
plt.ylabel('sin(x)')
plt.title('Annotated Sine Wave')
plt.tight_layout()
plt.show()Riempire tra le linee
plt.fill_between() ombreggia la regione tra due curve (o tra una curva e una costante). È comune per mostrare intervalli di confidenza o bande di incertezza.
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 200)
y = np.sin(x)
# Simulate an upper and lower confidence bound
upper = y + 0.3
lower = y - 0.3
plt.plot(x, y, color='steelblue', linewidth=2, label='mean')
plt.fill_between(x, lower, upper, alpha=0.2, color='steelblue', label='±0.3 band')
plt.xlabel('x')
plt.ylabel('Amplitude')
plt.title('Line with Confidence Band')
plt.legend()
plt.tight_layout()
plt.show()L'argomento alpha controlla quanto è trasparente l'ombreggiatura — valori intorno a 0.2–0.3 di solito funzionano bene affinché la linea rimanga chiaramente visibile.
Usare l'API orientata agli oggetti
Tutti gli esempi precedenti usano l'interfaccia senza stato plt.*, comoda per script con un singolo grafico. Per figure più complesse (più sottografici, grafici incorporati), usa l'API orientata agli oggetti in cui si lavora con oggetti espliciti Figure e Axes:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 200)
y1 = np.sin(x)
y2 = np.cos(x)
fig, ax = plt.subplots(figsize=(8, 4))
ax.plot(x, y1, label='sin(x)', color='steelblue', linewidth=1.5)
ax.plot(x, y2, label='cos(x)', color='darkorange', linewidth=1.5, linestyle='--')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_title('OO-style Line Plot')
ax.legend()
ax.grid(True, linestyle=':', alpha=0.6)
plt.tight_layout()
plt.show()L'API OO rispecchia le chiamate plt.* con prefissi ax.set_* per etichette e titoli. È lo stile preferito quando è necessario disporre più grafici — consulta Sottografici di Matplotlib per i dettagli.
Salvare un grafico a linee su file
Usa plt.savefig() prima di plt.show(). Specifica il formato del file tramite l'estensione:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 200)
y = np.sin(x)
plt.plot(x, y, color='steelblue', linewidth=2)
plt.xlabel('x')
plt.ylabel('sin(x)')
plt.title('Saved Line Plot')
plt.tight_layout()
plt.savefig('sine_wave.png', dpi=150) # raster PNG at 150 dpi
plt.savefig('sine_wave.svg') # vector SVG (ideal for web/print)
plt.show()Opzioni di formato comuni: png, pdf, svg, eps. Usa svg o pdf quando hai bisogno di un'immagine scalabile e pronta per la stampa. Chiama savefig() prima di show() — dopo show() la figura viene cancellata e savefig() produrrebbe un'immagine vuota.
Controllare le dimensioni della figura
La figura predefinita è 6,4 × 4,8 pollici a 100 dpi. Sovrascrivila con figsize=(larghezza_in, altezza_in):
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 200)
fig, ax = plt.subplots(figsize=(10, 4)) # wide and short
ax.plot(x, np.sin(x), label='sin', linewidth=1.5)
ax.plot(x, np.cos(x), label='cos', linewidth=1.5, linestyle='--')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_title('Wide Figure')
ax.legend()
plt.tight_layout()
plt.show()Riferimento rapido
| Operazione | Codice |
|---|---|
| Grafico a linee di base | plt.plot(x, y) |
| Linea rossa tratteggiata (abbreviazione) | plt.plot(x, y, 'r--') |
| Parametri di stile con nome | plt.plot(x, y, color='steelblue', linestyle='--', linewidth=2) |
| Aggiungere marcatori | plt.plot(x, y, marker='o', markersize=6) |
| Più linee con legenda | chiama plt.plot() due volte; plt.legend() |
| Impostare i limiti degli assi | plt.xlim(0, 5) / plt.ylim(-1, 1) |
| Aggiungere griglia | plt.grid(True, linestyle='--', alpha=0.5) |
| Annotare un punto | plt.annotate('text', xy=(x0, y0), xytext=(xt, yt), arrowprops={...}) |
| Ombreggiare tra curve | plt.fill_between(x, y_lower, y_upper, alpha=0.2) |
| Salvare su file | plt.savefig('file.png', dpi=150) |
| Impostare le dimensioni della figura | plt.subplots(figsize=(10, 4)) |
Capitoli correlati
- Introduzione a Matplotlib — panoramica della libreria e installazione
- Matplotlib Pyplot — l'interfaccia
pyplotin profondità - Marcatori di Matplotlib — forme e formattazione dei marcatori
- Etichette di Matplotlib — etichette degli assi, titoli e annotazioni
- Griglia di Matplotlib — aggiunta e stilizzazione delle linee della griglia
- Grafici a dispersione di Matplotlib — relazioni tra due variabili
- Grafici a barre di Matplotlib — confronto di quantità tra categorie
- Sottografici di Matplotlib — più grafici in una sola figura