W3docs

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:

ArgomentoFunzione
width_ratios=[2, 1, 1]Larghezze delle colonne come proporzioni relative
height_ratios=[1, 2]Altezze delle righe come proporzioni relative
hspace=0.4Spazio verticale tra le righe (frazione dell'altezza dell'asse)
wspace=0.3Spazio 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 di plt.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 a plt.subplots() o plt.figure(). Risolve un sistema di vincoli al momento del rendering; gestisce meglio le colorbar e i suptitle rispetto a tight_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

ObiettivoStrumento migliore
Griglia di sottoplot con dimensioni ugualiplt.subplots(nrows, ncols)
Sottoplot con dimensioni diverse o che si estendono su più celleGridSpec
Layout asimmetrico descritto visivamentesubplot_mosaic()
Linee di riferimento dietro i datiax.grid()
Posizionamento preciso dei tick per le linee di grigliaMultipleLocator + ax.grid(which=...)

Capitoli Correlati

Was this page helpful?