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:
- Importa
matplotlib.pyplot(convenzionalmente comeplt). - Chiama una funzione di plotting (
plt.plot(),plt.bar(), ecc.) con i tuoi dati. - Chiama funzioni decorative per aggiungere titoli, etichette degli assi, legende e così via.
- Chiama
plt.show()per visualizzare la figura, oppureplt.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 matplotlibVerifica l'installazione importandolo:
import matplotlib
print(matplotlib.__version__) # e.g. 3.9.0Creare 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=90ruota 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 rossoo— marcatore cerchio--— linea tratteggiata
Codici comuni per le stringhe di formato:
| Codice | Significato | Codice | Significato |
|---|---|---|---|
b | blu | - | linea continua |
g | verde | -- | linea tratteggiata |
r | rosso | -. | linea tratto-punto |
k | nero | : | linea punteggiata |
o | cerchio | s | quadrato |
^ | 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,.svge.pdf. bbox_inches="tight"riduce lo spazio bianco attorno alla figura in modo che nulla venga ritagliato.- Chiama sempre
plt.savefig()prima diplt.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 memorySubplot sovrapposti. Chiamare plt.tight_layout() o plt.subplots_adjust() dopo aver creato tutti i subplot risolve la sovrapposizione di titoli e tick label.
Riepilogo
| Tipo di grafico | Funzione | Ideale per |
|---|---|---|
| Grafico a linee | plt.plot() | Tendenze su dati ordinati |
| Grafico a barre | plt.bar() / plt.barh() | Confronto di categorie discrete |
| Grafico a torta | plt.pie() | Composizione parte-tutto |
| Scatter plot | plt.scatter() | Relazione tra due variabili |
| Subplot | plt.subplots() | Più grafici in una sola figura |
Capitoli Correlati
- Matplotlib Introduction — panoramica della libreria e dei suoi componenti
- Matplotlib Get Started — installazione e il tuo primo grafico
- Matplotlib Line Plots — stili di linea, marcatori e grafici multi-serie in dettaglio
- Matplotlib Bar Charts — barre verticali, orizzontali e sovrapposte
- Matplotlib Pie Charts — spicchi esplosi, colori personalizzati e grafici a ciambella
- Matplotlib Histograms — grafici di distribuzione e controllo dei bin
- Matplotlib Scatter Plot — bubble chart e scatter con mappatura dei colori
- Matplotlib Subplots — layout avanzati a più pannelli
- Matplotlib Labels — titoli, etichette degli assi, annotazioni e testo
- Matplotlib Grid — linee della griglia e personalizzazione dei tick
- Matplotlib Markers — stili, dimensioni e colori del bordo dei marcatori