Creazione di più sottotrame utilizzando plt.subplots#

pyplot.subplotscrea una figura e una griglia di sottotrame con una singola chiamata, fornendo al tempo stesso un ragionevole controllo su come vengono create le singole trame. Per casi d'uso più avanzati è possibile utilizzare GridSpecper un layout di sottotrama più generale o Figure.add_subplotper aggiungere sottotrame in posizioni arbitrarie all'interno della figura.

import matplotlib.pyplot as plt
import numpy as np

# Some example data to display
x = np.linspace(0, 2 * np.pi, 400)
y = np.sin(x ** 2)

Una figura con una sola sottotrama #

subplots()senza argomenti restituisce a Figuree un singolo Axes.

Questo è in realtà il modo più semplice e consigliato per creare una singola figura e assi.

fig, ax = plt.subplots()
ax.plot(x, y)
ax.set_title('A single plot')
Un unico appezzamento
Text(0.5, 1.0, 'A single plot')

Impilare le sottotrame in una direzione #

I primi due argomenti facoltativi di pyplot.subplotsdefiniscono il numero di righe e colonne della griglia della sottotrama.

Quando si esegue l'impilamento in una sola direzione, axsviene restituito un array numpy 1D contenente l'elenco degli assi creati.

fig, axs = plt.subplots(2)
fig.suptitle('Vertically stacked subplots')
axs[0].plot(x, y)
axs[1].plot(x, -y)
Sottotrame impilate verticalmente
[<matplotlib.lines.Line2D object at 0x7f2d00efd510>]

Se stai creando solo pochi assi, è utile decomprimerli immediatamente in variabili dedicate per ciascun asse. In questo modo, possiamo usare ax1invece del più prolisso axs[0].

fig, (ax1, ax2) = plt.subplots(2)
fig.suptitle('Vertically stacked subplots')
ax1.plot(x, y)
ax2.plot(x, -y)
Sottotrame impilate verticalmente
[<matplotlib.lines.Line2D object at 0x7f2d00a95b70>]

Per ottenere sottotrame affiancate, passare i parametri per una riga e due colonne.1, 2

fig, (ax1, ax2) = plt.subplots(1, 2)
fig.suptitle('Horizontally stacked subplots')
ax1.plot(x, y)
ax2.plot(x, -y)
Sottotrame impilate orizzontalmente
[<matplotlib.lines.Line2D object at 0x7f2cfb43d330>]

Impilare sottotrame in due direzioni #

Quando si esegue l'impilamento in due direzioni, axsviene restituito un array NumPy 2D.

Se devi impostare i parametri per ogni sottotrama, è utile scorrere tutte le sottotrame in una griglia 2D usando .for ax in axs.flat:

fig, axs = plt.subplots(2, 2)
axs[0, 0].plot(x, y)
axs[0, 0].set_title('Axis [0, 0]')
axs[0, 1].plot(x, y, 'tab:orange')
axs[0, 1].set_title('Axis [0, 1]')
axs[1, 0].plot(x, -y, 'tab:green')
axs[1, 0].set_title('Axis [1, 0]')
axs[1, 1].plot(x, -y, 'tab:red')
axs[1, 1].set_title('Axis [1, 1]')

for ax in axs.flat:
    ax.set(xlabel='x-label', ylabel='y-label')

# Hide x labels and tick labels for top plots and y ticks for right plots.
for ax in axs.flat:
    ax.label_outer()
Asse [0, 0], Asse [0, 1], Asse [1, 0], Asse [1, 1]

Puoi utilizzare il tuple-unpacking anche in 2D per assegnare tutte le sottotrame a variabili dedicate:

fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2)
fig.suptitle('Sharing x per column, y per row')
ax1.plot(x, y)
ax2.plot(x, y**2, 'tab:orange')
ax3.plot(x, -y, 'tab:green')
ax4.plot(x, -y**2, 'tab:red')

for ax in fig.get_axes():
    ax.label_outer()
Condivisione x per colonna, y per riga

Condividere gli assi #

Per impostazione predefinita, ogni asse viene ridimensionato individualmente. Pertanto, se gli intervalli sono diversi, i valori tick delle sottotrame non si allineano.

fig, (ax1, ax2) = plt.subplots(2)
fig.suptitle('Axes values are scaled individually by default')
ax1.plot(x, y)
ax2.plot(x + 1, -y)
I valori degli assi vengono ridimensionati individualmente per impostazione predefinita
[<matplotlib.lines.Line2D object at 0x7f2cfb007250>]

Puoi usare sharex o sharey per allineare l'asse orizzontale o verticale.

fig, (ax1, ax2) = plt.subplots(2, sharex=True)
fig.suptitle('Aligning x-axis using sharex')
ax1.plot(x, y)
ax2.plot(x + 1, -y)
Allineamento dell'asse x usando sharex
[<matplotlib.lines.Line2D object at 0x7f2cfa993370>]

L'impostazione di sharex o sharey su Trueconsente la condivisione globale su tutta la griglia, ovvero anche gli assi y delle sottotrame impilate verticalmente hanno la stessa scala quando si utilizza sharey=True.

fig, axs = plt.subplots(3, sharex=True, sharey=True)
fig.suptitle('Sharing both axes')
axs[0].plot(x, y ** 2)
axs[1].plot(x, 0.3 * y, 'o')
axs[2].plot(x, y, '+')
Condivisione di entrambi gli assi
[<matplotlib.lines.Line2D object at 0x7f2cfab12980>]

Per le sottotrame che condividono gli assi è sufficiente un set di etichette di spunta. Le etichette di spunta degli assi interni vengono rimosse automaticamente da sharex e sharey . Rimane ancora uno spazio vuoto inutilizzato tra le sottotrame.

Per controllare con precisione il posizionamento delle sottotrame, è possibile creare esplicitamente un GridSpecwith Figure.add_gridspece quindi chiamare il suo subplotsmetodo. Ad esempio, possiamo ridurre l'altezza tra le sottotrame verticali utilizzando add_gridspec(hspace=0).

label_outerè un metodo pratico per rimuovere etichette e segni di spunta dalle sottotrame che non si trovano ai margini della griglia.

fig = plt.figure()
gs = fig.add_gridspec(3, hspace=0)
axs = gs.subplots(sharex=True, sharey=True)
fig.suptitle('Sharing both axes')
axs[0].plot(x, y ** 2)
axs[1].plot(x, 0.3 * y, 'o')
axs[2].plot(x, y, '+')

# Hide x labels and tick labels for all but bottom plot.
for ax in axs:
    ax.label_outer()
Condivisione di entrambi gli assi

Oltre a Truee False, sia sharex che sharey accettano i valori 'row' e 'col' per condividere i valori solo per riga o colonna.

fig = plt.figure()
gs = fig.add_gridspec(2, 2, hspace=0, wspace=0)
(ax1, ax2), (ax3, ax4) = gs.subplots(sharex='col', sharey='row')
fig.suptitle('Sharing x per column, y per row')
ax1.plot(x, y)
ax2.plot(x, y**2, 'tab:orange')
ax3.plot(x + 1, -y, 'tab:green')
ax4.plot(x + 2, -y**2, 'tab:red')

for ax in axs.flat:
    ax.label_outer()
Condivisione x per colonna, y per riga

Se desideri una struttura di condivisione più complessa, puoi prima creare la griglia di assi senza condivisione, quindi chiamare axes.Axes.sharexo axes.Axes.shareyper aggiungere informazioni di condivisione a posteriori.

fig, axs = plt.subplots(2, 2)
axs[0, 0].plot(x, y)
axs[0, 0].set_title("main")
axs[1, 0].plot(x, y**2)
axs[1, 0].set_title("shares x with main")
axs[1, 0].sharex(axs[0, 0])
axs[0, 1].plot(x + 1, y + 1)
axs[0, 1].set_title("unrelated")
axs[1, 1].plot(x + 2, y + 2)
axs[1, 1].set_title("also unrelated")
fig.tight_layout()
principale, non correlato, condivide x con principale, anch'esso non correlato

Assi polari #

Il parametro subplot_kw di pyplot.subplotscontrolla le proprietà della sottotrama (vedi anche Figure.add_subplot). In particolare, questo può essere utilizzato per creare una griglia di Assi polari.

fig, (ax1, ax2) = plt.subplots(1, 2, subplot_kw=dict(projection='polar'))
ax1.plot(x, y)
ax2.plot(x, y ** 2)

plt.show()
demo delle sottotrame

Tempo di esecuzione totale dello script: (0 minuti 7,774 secondi)

Galleria generata da Sphinx-Gallery