두 개의 서브 플롯이 생성 된 후 x 축을 어떻게 공유합니까?


97

두 개의 서브 플롯 축을 공유하려고하는데 그림이 생성 된 후 x 축을 공유해야합니다. 예를 들어이 그림을 만듭니다.

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

주석 대신 두 x 축을 공유하는 코드를 삽입합니다. 어떻게 할 수 있을지 전혀 모르겠습니다. 몇 가지 속성이 _shared_x_axes있고 _shared_x_axes그림 축 ( fig.get_axes())을 확인할 때 연결 방법을 모르겠습니다.

답변:


140

축을 공유하는 일반적인 방법은 생성시 공유 속성을 만드는 것입니다. 어느 한 쪽

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

또는

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

따라서 축을 만든 후 공유 할 필요가 없습니다.

그러나 어떤 이유로 든 축을 생성 한 후 공유 해야하는 경우 (실제로 here 과 같은 일부 서브 플롯을 생성하는 다른 라이브러리를 사용 하거나 삽입 된 축을 공유하는 것이 이유 일 수 있음) 여전히 해결책이 있습니다.

사용

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

두 축 사이에 링크를 생성 ax1하고 ax2. 생성시 공유와 달리 축 중 하나에 대해 xticklabels를 수동으로 설정해야합니다 (원하는 경우).

완전한 예 :

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

그런데 이상한 이유는 피클을 사용하여 그림을 저장하고 sharex 속성을 해제하는 다른 프로그램으로 다시로드하기 때문입니다.
ymmx

4
선택한 서브 플롯을 연결하는 데 유용합니다. 예를 들어, 4 개의 서브 플롯이있는 그림 (2 개의 시계열과 2 개의 히스토그램). 이를 통해 시계열을 선택적으로 연결할 수 있습니다.
Hamid

2
Grouper 객체에 대한 API 문서 : matplotlib.org/2.0.2/api/…
michaelosthege

3
오, 방금 축을 공유 해제 하는 방법을 알아 냈습니다 (큰 그리드에서 유용 할 수 있음)-해당 축에서 g = ax.get_shared_y_axes(); g.remove(a) for a in g.get_siblings(ax)]. 시작해 주셔서 감사합니다!
naught101

3
@ naught101 그냥 전화 할 수 있습니다 ax2.autoscale().
ImportanceOfBeingErnest
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.