W3docs

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 matplotlib

Se 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()
ParametroCosa controllaValori di esempio
colorColore della linea'red', '#3498db', (0.2, 0.6, 0.8)
linestyleSchema dei tratteggi'-', '--', '-.', ':'
linewidthSpessore in punti1 (predefinito), 2, 3
alphaTrasparenza 0–10.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.20.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

OperazioneCodice
Grafico a linee di baseplt.plot(x, y)
Linea rossa tratteggiata (abbreviazione)plt.plot(x, y, 'r--')
Parametri di stile con nomeplt.plot(x, y, color='steelblue', linestyle='--', linewidth=2)
Aggiungere marcatoriplt.plot(x, y, marker='o', markersize=6)
Più linee con legendachiama plt.plot() due volte; plt.legend()
Impostare i limiti degli assiplt.xlim(0, 5) / plt.ylim(-1, 1)
Aggiungere grigliaplt.grid(True, linestyle='--', alpha=0.5)
Annotare un puntoplt.annotate('text', xy=(x0, y0), xytext=(xt, yt), arrowprops={...})
Ombreggiare tra curveplt.fill_between(x, y_lower, y_upper, alpha=0.2)
Salvare su fileplt.savefig('file.png', dpi=150)
Impostare le dimensioni della figuraplt.subplots(figsize=(10, 4))

Capitoli correlati

Was this page helpful?