W3docs

Python Matplotlib Plotting: Una Guida Completa

Impara a creare e personalizzare grafici a linee, a barre, a torta, scatter plot e subplot in Python con Matplotlib, con esempi chiari.

Matplotlib è la libreria di visualizzazione dei dati più utilizzata in Python. Questa guida spiega come creare i tipi di grafico più comuni — grafici a linee, a barre, a torta, scatter plot e subplot — e come personalizzarli con etichette, colori, legende e controlli di layout. Si presuppone che tu abbia già installato Matplotlib e possa eseguire script Python in locale.

Cos'è Matplotlib Plotting?

Il modulo pyplot di Matplotlib fornisce un'interfaccia in stile MATLAB che ti consente di costruire grafici passo dopo passo: crea una figura, aggiungi dati, aggiungi etichette, poi visualizza o salva il risultato. Ogni grafico segue lo stesso schema:

  1. Importa matplotlib.pyplot (convenzionalmente come plt).
  2. Chiama una funzione di plotting (plt.plot(), plt.bar(), ecc.) con i tuoi dati.
  3. Chiama funzioni decorative per aggiungere titoli, etichette degli assi, legende e così via.
  4. Chiama plt.show() per visualizzare la figura, oppure plt.savefig() per scriverla su disco.

Comprendere questa sequenza rende semplice passare da un tipo di grafico all'altro e combinarli in figure più complesse.

Installare Matplotlib

Se non hai ancora installato Matplotlib, esegui il seguente comando nel tuo terminale:

pip install matplotlib

Verifica l'installazione importandolo:

import matplotlib
print(matplotlib.__version__)  # e.g. 3.9.0

Creare un Grafico a Linee

Un grafico a linee è il tipo di grafico predefinito ed è ideale per mostrare tendenze nel tempo o in qualsiasi sequenza ordinata.

import matplotlib.pyplot as plt

# Data
years = [2015, 2016, 2017, 2018, 2019, 2020]
sales = [100, 150, 200, 250, 300, 350]

# Plot
plt.plot(years, sales)

# Labels and title
plt.xlabel("Year")
plt.ylabel("Sales (units)")
plt.title("Annual Sales")

plt.show()

plt.plot(x, y) disegna una linea continua che collega ogni coppia (x, y). L'asse x mostra gli anni e l'asse y mostra i dati di vendita, evidenziando la tendenza al rialzo a colpo d'occhio.

Tracciare Più Linee

Per confrontare due dataset sugli stessi assi, chiama plt.plot() due volte prima di plt.show(). Usa il parametro label e plt.legend() per identificare ogni linea:

import matplotlib.pyplot as plt

years = [2018, 2019, 2020, 2021, 2022]
product_a = [120, 145, 170, 210, 260]
product_b = [90, 115, 140, 165, 195]

plt.plot(years, product_a, label="Product A")
plt.plot(years, product_b, label="Product B")

plt.xlabel("Year")
plt.ylabel("Revenue ($k)")
plt.title("Revenue by Product")
plt.legend()

plt.show()

Matplotlib assegna automaticamente colori diversi a ogni serie. Chiamando plt.legend() si aggiunge una legenda che associa i colori alle etichette.

Creare un Grafico a Barre

I grafici a barre confrontano categorie discrete. Usa plt.bar() per barre verticali e plt.barh() per barre orizzontali.

import matplotlib.pyplot as plt

countries = ["USA", "China", "Japan", "Germany", "UK"]
gdp = [21.44, 14.14, 5.15, 4.17, 2.62]

plt.bar(countries, gdp, color="steelblue")

plt.xlabel("Country")
plt.ylabel("GDP (USD trillions)")
plt.title("Top 5 Economies by GDP")

plt.show()

L'altezza di ogni barra rappresenta il valore del PIL. Il parametro color accetta qualsiasi colore CSS con nome, stringa esadecimale o tupla RGB.

Grafici a Barre Raggruppate

Quando devi confrontare più categorie affiancate, sposta manualmente le posizioni delle barre usando range() e un offset della larghezza:

import matplotlib.pyplot as plt

categories = ["Q1", "Q2", "Q3", "Q4"]
team_a = [30, 45, 38, 52]
team_b = [25, 40, 35, 48]

x = range(len(categories))
width = 0.35

plt.bar([i - width / 2 for i in x], team_a, width=width, label="Team A")
plt.bar([i + width / 2 for i in x], team_b, width=width, label="Team B")

plt.xticks(x, categories)
plt.xlabel("Quarter")
plt.ylabel("Sales")
plt.title("Quarterly Sales by Team")
plt.legend()

plt.show()

plt.xticks(x, categories) sostituisce le posizioni numeriche dei tick con i nomi effettivi dei trimestri.

Creare un Grafico a Torta

I grafici a torta mostrano come le parti compongono un insieme. Usali con parsimonia — funzionano meglio con cinque o meno spicchi che sommano al 100 %.

import matplotlib.pyplot as plt

brands = ["Samsung", "Apple", "Huawei", "Xiaomi", "Others"]
market_share = [19.2, 15.9, 14.6, 10.2, 40.1]

plt.pie(
    market_share,
    labels=brands,
    autopct="%1.1f%%",   # show percentage inside each slice
    startangle=90,       # rotate so the first slice starts at the top
)

plt.title("Smartphone Market Share")

plt.show()
  • autopct="%1.1f%%" stampa la percentuale con un decimale all'interno di ogni spicchio.
  • startangle=90 ruota il grafico in modo che il primo spicchio parta dalle 12 in punto, il che è più facile da leggere.

Nota: Le quote di mercato indicate sopra sono approssimative e vengono utilizzate qui solo a scopo illustrativo.

Creare uno Scatter Plot

Gli scatter plot rivelano la relazione tra due variabili continue. Ogni punto rappresenta un'osservazione.

import matplotlib.pyplot as plt

hours_studied = [1, 2, 3, 4, 5, 6, 7, 8]
exam_scores   = [45, 52, 60, 65, 72, 78, 85, 90]

plt.scatter(hours_studied, exam_scores, color="coral", edgecolors="black", s=80)

plt.xlabel("Hours Studied")
plt.ylabel("Exam Score")
plt.title("Study Time vs. Exam Score")

plt.show()

Il parametro s controlla la dimensione del marcatore in punti al quadrato. edgecolors="black" aggiunge un contorno a ogni punto, rendendoli più facili da distinguere quando i punti si sovrappongono.

Per un approfondimento, consulta il capitolo Matplotlib Scatter Plot.

Personalizzare l'Aspetto del Grafico

Matplotlib offre un controllo preciso su quasi ogni elemento visivo.

Colori, Marcatori e Stili di Linea

Passa una stringa di formato come terzo argomento a plt.plot() per impostare lo stile del marcatore, lo stile della linea e il colore in un solo passaggio:

import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]

plt.plot(x, y, "ro--")   # red circles, dashed line
plt.xlabel("x")
plt.ylabel("y")
plt.title("Custom Style")
plt.show()

La stringa di formato "ro--" combina:

  • r — colore rosso
  • o — marcatore cerchio
  • -- — linea tratteggiata

Codici comuni per le stringhe di formato:

CodiceSignificatoCodiceSignificato
bblu-linea continua
gverde--linea tratteggiata
rrosso-.linea tratto-punto
knero:linea punteggiata
ocerchiosquadrato
^triangolo su*stella

Puoi anche passare argomenti con parola chiave per un controllo maggiore:

plt.plot(x, y, color="#2196f3", linewidth=2, linestyle="--", marker="o", markersize=8)

Dimensioni della Figura e DPI

Imposta le dimensioni della figura (in pollici) prima del tracciamento chiamando plt.figure():

import matplotlib.pyplot as plt

plt.figure(figsize=(10, 5), dpi=100)   # 1000×500 pixels

x = [1, 2, 3, 4, 5]
y = [1, 4, 9, 16, 25]

plt.plot(x, y)
plt.title("Wide Figure")
plt.show()

figsize=(width, height) accetta valori in pollici. dpi (punti per pollice) controlla la densità dei pixel — 100 dpi va bene per lo schermo; 300 dpi è tipico per la stampa.

Aggiungere una Griglia

Una griglia rende più facile leggere i valori:

import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5]
y = [3, 7, 2, 9, 4]

plt.plot(x, y, marker="o")
plt.grid(True, linestyle="--", alpha=0.7)
plt.title("Plot with Grid")
plt.show()

alpha=0.7 rende le linee della griglia semi-trasparenti in modo che non sovrastino i dati. Consulta il capitolo Matplotlib Grid per ulteriori opzioni.

Creare Subplot

I subplot ti consentono di visualizzare più grafici in una sola figura, il che è utile per confrontare diverse viste dello stesso dataset.

import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5]
y1 = [2, 4, 6, 8, 10]
y2 = [1, 4, 9, 16, 25]
y3 = [5, 3, 7, 2, 8]
y4 = [10, 7, 4, 5, 6]

fig, axes = plt.subplots(2, 2, figsize=(10, 8))

axes[0][0].plot(x, y1, "b-o")
axes[0][0].set_title("Linear")

axes[0][1].plot(x, y2, "r--s")
axes[0][1].set_title("Quadratic")

axes[1][0].bar(x, y3, color="green")
axes[1][0].set_title("Bar Chart")

axes[1][1].scatter(x, y4, color="purple", s=80)
axes[1][1].set_title("Scatter")

plt.tight_layout()   # prevent overlapping labels
plt.show()

plt.subplots(rows, cols) restituisce un oggetto Figure e un array 2D di oggetti Axes. Lavorare con singoli oggetti Axes (ad es. axes[0][0].plot(...)) è l'approccio preferito per i layout multi-grafico perché offre un controllo indipendente su ogni pannello. plt.tight_layout() regola automaticamente la spaziatura in modo che titoli ed etichette non si sovrappongano.

Consulta il capitolo Matplotlib Subplots per opzioni di layout avanzate.

Salvare un Grafico su File

plt.savefig() scrive la figura corrente su disco. Deduce il formato del file dall'estensione:

import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]

plt.plot(x, y, marker="o")
plt.title("Saved Plot")

plt.savefig("my_plot.png", dpi=150, bbox_inches="tight")
  • I formati supportati includono .png, .jpg, .svg e .pdf.
  • bbox_inches="tight" riduce lo spazio bianco attorno alla figura in modo che nulla venga ritagliato.
  • Chiama sempre plt.savefig() prima di plt.show()plt.show() azzera lo stato della figura.

Errori Comuni

plt.show() cancella la figura. Se chiami plt.savefig() dopo plt.show(), salverai un'immagine vuota. Salva sempre prima, poi mostra.

Esecuzione in ambienti non interattivi. Negli script, plt.show() apre una finestra GUI e si blocca finché non viene chiusa. Nei notebook Jupyter, usa %matplotlib inline all'inizio in modo che i grafici vengano visualizzati inline. Nei server headless (CI, Docker), passa a un backend non interattivo: import matplotlib; matplotlib.use("Agg") prima di importare pyplot.

Dimenticare di chiudere le figure. Ogni chiamata a plt.figure() apre una nuova figura in memoria. Nei cicli che generano molti grafici, chiudi ciascuno con plt.close() per evitare l'esaurimento della memoria.

import matplotlib.pyplot as plt

for i in range(10):
    plt.plot([1, 2, 3], [i, i * 2, i * 3])
    plt.savefig(f"plot_{i}.png")
    plt.close()   # release memory

Subplot sovrapposti. Chiamare plt.tight_layout() o plt.subplots_adjust() dopo aver creato tutti i subplot risolve la sovrapposizione di titoli e tick label.

Tipo di graficoFunzioneIdeale per
Grafico a lineeplt.plot()Tendenze su dati ordinati
Grafico a barreplt.bar() / plt.barh()Confronto di categorie discrete
Grafico a tortaplt.pie()Composizione parte-tutto
Scatter plotplt.scatter()Relazione tra due variabili
Subplotplt.subplots()Più grafici in una sola figura

Capitoli Correlati

Was this page helpful?