Python Matplotlib에서 여러 서브플롯(subplot) 전체에 걸쳐 하나의 그리드를 그리려면, 먼저 여러 개의 서브플롯을 생성한 뒤 별도의 배경용 축(ax3)을 만들어 테두리(spine)와 눈금 레이블을 숨기고, X축을 다른 서브플롯과 공유하는 방식으로 구현할 수 있습니다.
구현 단계
- 그림(figure) 크기를 설정하고 서브플롯 사이 및 주변 여백(padding)을 조정합니다.
- subplots() 메서드를 사용해 figure와 서브플롯 집합을 생성합니다.
- 현재 figure에 새로운 서브플롯(ax3)을 추가하고, 모든 spine의 가시성을 false로 설정합니다.
- ax3의 눈금 레이블과 눈금선을 모두 제거합니다.
- X축을 상위 서브플롯들과 공유하도록 설정합니다.
- ax1, ax2, ax3 각각에 대해 그리드 선을 구성합니다.
- show() 메서드를 사용해 결과를 화면에 표시합니다.
예제 코드
import matplotlib.pyplot as plt
plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True
fig, (ax1, ax2) = plt.subplots(nrows=2)
ax3 = fig.add_subplot(111, zorder=-1)
for _, spine in ax3.spines.items():
spine.set_visible(False)
ax3.tick_params(labelleft=False, labelbottom=False, left=False, right=False)
ax3.get_shared_x_axes().join(ax3, ax1)
ax3.grid(axis="x")
ax1.grid()
ax2.grid()
plt.show()코드 설명
이 기법의 핵심은 zorder=-1 옵션입니다. 이 옵션으로 생성된 ax3는 다른 서브플롯 뒤쪽에 배치되므로, ax3에 그린 세로 그리드(axis="x")가 두 서브플롯의 배경을 관통하는 것처럼 보이게 됩니다.
또한 spine.set_visible(False)로 테두리를 숨기고 tick_params()로 눈금 레이블과 눈금선을 모두 제거하여, ax3 자체는 아무런 시각적 요소 없이 그리드만 남기게 됩니다. 마지막으로 get_shared_x_axes().join()으로 X축 범위를 ax1과 동기화하면, 위아래 서브플롯의 그리드 위치가 정확히 일치하게 됩니다.
실행 결과
