Griglia Matplotlib
Scopri come creare layout a griglia multi-grafico e aggiungere linee di griglia in Matplotlib usando subplots, GridSpec, subplot_mosaic e opzioni di stile.
Matplotlib supporta due utilizzi distinti della parola "griglia": layout a griglia multi-grafico (disposizione di più assi affiancati in una figura) e linee di griglia di sfondo (le linee di riferimento tracciate dietro i dati su un singolo asse). Questo capitolo tratta entrambi, partendo dai layout a griglia e terminando con lo stile delle linee di griglia.
Dovresti già avere dimestichezza con la creazione di grafici di base — in caso contrario, consulta prima i capitoli Matplotlib Plotting e Matplotlib Subplot.
Layout a Griglia Multi-Grafico
Quando occorre visualizzare più grafici correlati in una sola figura, li si dispone in una griglia di righe e colonne. Matplotlib offre tre approcci, ciascuno adatto a diversi livelli di complessità.
plt.subplots() — il metodo rapido
plt.subplots(nrows, ncols) è il modo più veloce per griglie uniformi in cui ogni sottoplot ha la stessa dimensione. Restituisce una Figure e un array NumPy di Axes.
import matplotlib.pyplot as plt
# 2-row, 2-column grid — four equal subplots
fig, axs = plt.subplots(nrows=2, ncols=2, figsize=(8, 6))
axs[0, 0].plot([1, 2, 3], [4, 5, 6])
axs[0, 0].set_title("Line plot")
axs[0, 1].scatter([1, 2, 3], [4, 5, 6])
axs[0, 1].set_title("Scatter plot")
axs[1, 0].bar([1, 2, 3], [4, 5, 6])
axs[1, 0].set_title("Bar chart")
axs[1, 1].hist([1, 2, 3, 4, 5, 6], bins=3)
axs[1, 1].set_title("Histogram")
plt.tight_layout()
plt.show()tight_layout() regola automaticamente la spaziatura in modo che titoli ed etichette degli assi non si sovrappongano. Passa figsize=(larghezza, altezza) in pollici per controllare le dimensioni complessive della figura.
Condivisione degli assi
Quando i grafici condividono la stessa scala, puoi collegare i loro assi in modo che lo zoom su uno si applichi a tutti:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 2 * np.pi, 100)
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(9, 3), sharey=True)
ax1.plot(x, np.sin(x))
ax1.set_title("sin(x)")
ax2.plot(x, np.cos(x))
ax2.set_title("cos(x)")
plt.tight_layout()
plt.show()sharey=True collega l'intervallo dell'asse y tra entrambi i sottoplot; sharex=True fa lo stesso per l'asse x.
GridSpec — celle di dimensioni variabili
GridSpec consente di assegnare pesi diversi a righe e colonne, così alcuni sottoplot possono essere più alti o più larghi di altri. Permette anche a un singolo sottoplot di estendersi su più celle.
import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec
fig = plt.figure(figsize=(9, 6))
# 2 rows, 3 columns; bottom row is twice as tall
gs = GridSpec(nrows=2, ncols=3, height_ratios=[1, 2], hspace=0.4, wspace=0.3)
ax_top_left = fig.add_subplot(gs[0, 0])
ax_top_mid = fig.add_subplot(gs[0, 1])
ax_top_right = fig.add_subplot(gs[0, 2])
ax_bottom = fig.add_subplot(gs[1, :]) # spans all three columns
ax_top_left.plot([0, 1, 2], [0, 1, 0])
ax_top_left.set_title("Top left")
ax_top_mid.bar([0, 1, 2], [3, 1, 4])
ax_top_mid.set_title("Top centre")
ax_top_right.scatter([0, 1, 2], [2, 7, 1])
ax_top_right.set_title("Top right")
ax_bottom.plot([0, 1, 2, 3, 4], [0, 1, 4, 9, 16], color="steelblue", linewidth=2)
ax_bottom.set_title("Bottom — full width")
plt.show()Argomenti chiave di GridSpec:
| Argomento | Funzione |
|---|---|
width_ratios=[2, 1, 1] | Larghezze delle colonne come proporzioni relative |
height_ratios=[1, 2] | Altezze delle righe come proporzioni relative |
hspace=0.4 | Spazio verticale tra le righe (frazione dell'altezza dell'asse) |
wspace=0.3 | Spazio orizzontale tra le colonne (frazione della larghezza dell'asse) |
Lo slicing con gs[riga, col] funziona esattamente come con NumPy: gs[1, :] si estende su tutte le colonne; gs[:, 0] si estende su tutte le righe nella prima colonna.
subplot_mosaic() — layout da una stringa
Introdotto in Matplotlib 3.3, subplot_mosaic() consente di descrivere il layout con una stringa o una lista annidata che ricorda una mappa ASCII della figura. Questo è spesso l'approccio più leggibile per layout asimmetrici.
import matplotlib.pyplot as plt
layout = """
AB
CC
"""
fig, axes = plt.subplot_mosaic(layout, figsize=(8, 5))
axes["A"].set_title("Panel A")
axes["A"].plot([1, 2, 3], [3, 1, 2])
axes["B"].set_title("Panel B")
axes["B"].scatter([1, 2, 3], [2, 3, 1])
axes["C"].set_title("Panel C — full width")
axes["C"].bar(["x", "y", "z"], [5, 3, 7])
plt.tight_layout()
plt.show()Ogni lettera univoca nella stringa diventa un Axes. Le lettere ripetute nella stessa riga/colonna fanno sì che il sottoplot si estenda su quelle celle. Il dizionario axes restituito è indicizzato per etichetta, quindi accedere ai pannelli per nome è più chiaro dell'indicizzazione numerica.
Controllo della spaziatura: tight_layout vs constrained_layout
Due sistemi integrati gestiscono la spaziatura automatica:
plt.tight_layout()— chiamalo prima diplt.show(). Regola i parametri del sottoplot affinché etichette e titoli rientrino nello spazio disponibile. Semplice e affidabile per la maggior parte dei layout.constrained_layout=True— passalo aplt.subplots()oplt.figure(). Risolve un sistema di vincoli al momento del rendering; gestisce meglio le colorbar e i suptitle rispetto atight_layout.
import matplotlib.pyplot as plt
# constrained_layout keeps the super-title from overlapping the subplots
fig, axs = plt.subplots(1, 2, figsize=(8, 3), constrained_layout=True)
fig.suptitle("Two plots with constrained_layout", fontsize=13)
axs[0].plot([1, 2, 3], [1, 4, 9])
axs[0].set_title("Subplot 1")
axs[1].plot([1, 2, 3], [9, 4, 1])
axs[1].set_title("Subplot 2")
plt.show()Non usarli entrambi contemporaneamente — entrano in conflitto. constrained_layout è la scelta più moderna.
Per il controllo manuale, fig.subplots_adjust(left, right, top, bottom, hspace, wspace) sovrascrive completamente la spaziatura automatica.
Linee di Griglia di Sfondo
Su un singolo asse, ax.grid() traccia linee di riferimento nelle posizioni dei tick. Queste sono diverse dalla griglia di layout descritta sopra — sono guide visive tracciate dietro i dati del grafico.
Abilitare le linee di griglia
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(6, 4))
ax.plot([1, 2, 3, 4, 5], [2, 5, 3, 8, 6], marker="o")
# Enable gridlines on both axes
ax.grid(True)
ax.set_title("Plot with gridlines")
plt.tight_layout()
plt.show()Stilizzare le linee di griglia
Passa argomenti keyword a ax.grid() per modificarne l'aspetto:
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(6, 4))
ax.plot([1, 2, 3, 4, 5], [2, 5, 3, 8, 6], marker="o", color="steelblue")
ax.grid(
True,
which="major", # "major", "minor", or "both"
axis="both", # "x", "y", or "both"
color="gray",
linestyle="--",
linewidth=0.7,
alpha=0.7,
)
ax.set_title("Styled gridlines")
plt.tight_layout()
plt.show()Linee di griglia principali e secondarie
Matplotlib distingue i tick principali (quelli etichettati) dai tick secondari (suddivisioni non etichettate). Puoi mostrare le linee di griglia a entrambi i livelli:
import matplotlib.pyplot as plt
from matplotlib.ticker import MultipleLocator
fig, ax = plt.subplots(figsize=(7, 4))
ax.plot([0, 1, 2, 3, 4, 5, 6], [0, 1, 4, 9, 16, 25, 36])
# Major gridlines every 1 unit, minor every 0.5
ax.xaxis.set_major_locator(MultipleLocator(1))
ax.xaxis.set_minor_locator(MultipleLocator(0.5))
ax.yaxis.set_major_locator(MultipleLocator(10))
ax.yaxis.set_minor_locator(MultipleLocator(5))
ax.grid(True, which="major", linestyle="-", linewidth=0.8, color="gray", alpha=0.6)
ax.grid(True, which="minor", linestyle=":", linewidth=0.5, color="silver", alpha=0.5)
ax.set_title("Major and minor gridlines")
plt.tight_layout()
plt.show()Abilitare i tick secondari senza il locator
Se vuoi semplicemente mostrare i tick secondari senza posizionarli manualmente:
ax.minorticks_on()
ax.grid(True, which="both")Stilizzazione con i fogli di stile Matplotlib
Le linee di griglia sono controllate anche dai fogli di stile. Lo stile seaborn-v0_8-whitegrid, ad esempio, abilita automaticamente le linee di griglia orizzontali:
import matplotlib.pyplot as plt
plt.style.use("seaborn-v0_8-whitegrid")
fig, ax = plt.subplots(figsize=(6, 4))
ax.plot([1, 2, 3, 4], [3, 7, 2, 9], marker="s")
ax.set_title("seaborn-v0_8-whitegrid style")
plt.tight_layout()
plt.show()Esegui plt.style.available per elencare tutti gli stili integrati.
Scegliere l'Approccio Giusto
| Obiettivo | Strumento migliore |
|---|---|
| Griglia di sottoplot con dimensioni uguali | plt.subplots(nrows, ncols) |
| Sottoplot con dimensioni diverse o che si estendono su più celle | GridSpec |
| Layout asimmetrico descritto visivamente | subplot_mosaic() |
| Linee di riferimento dietro i dati | ax.grid() |
| Posizionamento preciso dei tick per le linee di griglia | MultipleLocator + ax.grid(which=...) |
Capitoli Correlati
- Matplotlib Subplot — approfondimento su
plt.subplots()e gli oggetti axes - Matplotlib Labels — aggiungere titoli, etichette degli assi e annotazioni
- Matplotlib Plotting — grafici a linee, a barre e a torta
- Matplotlib Scatter — grafici a dispersione e personalizzazione dei marcatori