Jak współdzielić oś x dwóch wykresów podrzędnych po ich utworzeniu?

98

Próbuję udostępnić dwie osie wykresów podrzędnych, ale muszę udostępnić oś x po utworzeniu figury. Na przykład tworzę tę figurę:

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()

Zamiast komentarza wstawiłbym kod, aby udostępnić obie osie x. Nie znalazłem żadnej wskazówki, jak mogę to zrobić. Są pewne atrybuty _shared_x_axesi _shared_x_axeskiedy sprawdzam oś rysunku ( fig.get_axes()), ale nie wiem, jak je połączyć.

ymmx
źródło

Odpowiedzi:

142

Zwykłym sposobem współdzielenia osi jest tworzenie wspólnych właściwości podczas tworzenia. Zarówno

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

lub

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

Dlatego współdzielenie osi po ich utworzeniu nie powinno być konieczne.

Jeśli jednak z jakiegoś powodu musisz udostępnić osie po ich utworzeniu (właściwie, używając innej biblioteki, która tworzy niektóre podploty, jak tutaj , lub współdzielenie wstawionych osi może być powodem), nadal byłoby rozwiązanie:

Za pomocą

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

tworzy połączenie między dwiema osiami, ax1a ax2. W przeciwieństwie do udostępniania w czasie tworzenia, będziesz musiał ręcznie wyłączyć xticklabels dla jednej z osi (w razie potrzeby).

Kompletny przykład:

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
źródło
Nawiasem mówiąc, dziwnym powodem jest to, że zapisałem jakąś figurę za pomocą pickle i przeładowuję ją innym programem, który traci właściwość sharex.
ymmx
4
Jest to przydatne do łączenia wybranych działek podrzędnych. Na przykład liczba z 4 wykresami podrzędnymi: dwoma szeregami czasowymi i dwoma histogramami. Pozwala to na selektywne łączenie szeregów czasowych.
Hamid
2
Dokumentacja
michaelosthege
3
Och, właśnie wymyśliłem, jak cofnąć udostępnianie osi (co może być przydatne w dużej siatce) - na tej osi, zrób g = ax.get_shared_y_axes(); g.remove(a) for a in g.get_siblings(ax)]. Dzięki za punkt wyjścia!
naught101
4
@ naught101 Możesz po prostu zadzwonić ax2.autoscale().
ImportanceOfBeingErnest