Come condividere l'asse x di due sottotrame dopo che sono state create?


97

Sto cercando di condividere due sottotrame asse, ma ho bisogno di condividere l'asse x dopo che la figura è stata creata. Quindi, ad esempio, creo questa figura:

import numpy as np
import matplotlib.pyplot as plt

t= np.arange(1000)/100.
x = np.sin(2*np.pi*10*t)
y = np.cos(2*np.pi*10*t)

fig=plt.figure()
ax1 = plt.subplot(211)
plt.plot(t,x)
ax2 = plt.subplot(212)
plt.plot(t,y)

# some code to share both x axis

plt.show()

Al posto del commento inserisco del codice per condividere entrambi gli assi x. Non ho trovato la minima idea di come posso farlo. Ci sono alcuni attributi _shared_x_axese _shared_x_axesquando controllo su figure axis ( fig.get_axes()) ma non so come collegarli.

Risposte:


137

Il modo usuale per condividere gli assi è creare le proprietà condivise al momento della creazione. O

fig=plt.figure()
ax1 = plt.subplot(211)
ax2 = plt.subplot(212, sharex = ax1)

o

fig, (ax1, ax2) = plt.subplots(nrows=2, sharex=True)

Pertanto, la condivisione degli assi dopo che sono stati creati non dovrebbe essere necessaria.

Tuttavia, se per qualsiasi motivo, è necessario condividere gli assi dopo che sono stati creati (in realtà, utilizzando una libreria diversa che crea alcune sottotrame, come qui , o condividere un inset assi potrebbe essere una ragione), ci sarebbe comunque una soluzione:

Utilizzando

ax1.get_shared_x_axes().join(ax1, ax2)

crea un collegamento tra i due assi ax1e ax2. Contrariamente alla condivisione al momento della creazione, dovrai disattivare manualmente le xticklabels per uno degli assi (nel caso in cui sia desiderato).

Un esempio completo:

import numpy as np
import matplotlib.pyplot as plt

t= np.arange(1000)/100.
x = np.sin(2*np.pi*10*t)
y = np.cos(2*np.pi*10*t)

fig=plt.figure()
ax1 = plt.subplot(211)
ax2 = plt.subplot(212)

ax1.plot(t,x)
ax2.plot(t,y)

ax1.get_shared_x_axes().join(ax1, ax2)
ax1.set_xticklabels([])
# ax2.autoscale() ## call autoscale if needed

plt.show()

La strana ragione, a proposito, è che ho salvato alcune figure con pickle e le ho ricaricate con un altro programma che perde la proprietà sharex.
ymmx

4
Ciò è utile per connettere sottotrame selezionate. Ad esempio, una figura con 4 sottotrame: due serie temporali e due istogrammi. Ciò consente di collegare selettivamente le serie temporali.
Hamid

2
Documenti API per l'oggetto Grouper: matplotlib.org/2.0.2/api/…
michaelosthege

3
Ohh, ho appena capito come annullare la condivisione di un asse (che può essere utile in una griglia grande) - su quell'asse, fallo g = ax.get_shared_y_axes(); g.remove(a) for a in g.get_siblings(ax)]. Grazie per il punto di partenza!
nought101

3
@ naught101 Puoi semplicemente chiamare ax2.autoscale().
ImportanceOfBeingErnest
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.