Como compartilhar o eixo x de dois subplots após serem criados?

98

Estou tentando compartilhar dois eixos de subtramas, mas preciso compartilhar o eixo x depois que a figura foi criada. Então, por exemplo, eu crio esta 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()

Em vez do comentário, gostaria de inserir algum código para compartilhar os dois eixos x. Não encontrei nenhuma pista de como posso fazer isso. Existem alguns atributos _shared_x_axese _shared_x_axesquando eu verifico o eixo da figura ( fig.get_axes()), mas não sei como vinculá-los.

ymmx
fonte

Respostas:

142

A maneira usual de compartilhar eixos é criar as propriedades compartilhadas na criação. Ou

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

ou

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

Compartilhar os eixos após sua criação não deve ser necessário.

No entanto, se por algum motivo, você precisar compartilhar eixos após eles terem sido criados (na verdade, usar uma biblioteca diferente que cria alguns subtramas, como aqui , ou compartilhar um eixo inserido pode ser um motivo), ainda haveria uma solução:

Usando

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

cria um link entre os dois eixos ax1e ax2. Em contraste com o compartilhamento no momento da criação, você terá que definir os xticklabels manualmente para um dos eixos (no caso de ser desejado).

Um exemplo 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()
ImportanceOfBeingErnest
fonte
O estranho motivo, aliás, é que salvei alguns números com pickle e os recarrego com outro programa que perde a propriedade sharex.
ymmx
4
Isso é útil para conectar subtramas selecionadas. Por exemplo, uma figura com 4 subtramas: duas séries temporais e dois histogramas. Isso permite vincular seletivamente a série temporal.
Hamid
2
Documentos da API para o objeto Grouper: matplotlib.org/2.0.2/api/…
michaelosthege
3
Ohh, acabei de descobrir como cancelar o compartilhamento de um eixo (o que pode ser útil em uma grade grande) - nesse eixo, faça g = ax.get_shared_y_axes(); g.remove(a) for a in g.get_siblings(ax)]. Obrigado pelo ponto de partida!
naught101
4
@ naught101 Você pode simplesmente ligar ax2.autoscale().
ImportanceOfBeingErnest