반응형
Python plt broken axis
파이썬에서 matplotlib 모듈을 활용하여 그래프를 그릴 때,
축을 중간에서 절단하여 물결선과 비슷한 효과를 낼 수 있는 방법을 살펴보도록 하겠습니다.
참고로, 해당 글은 아래의 matplotlib 공식 사이트 글의 코드를 참고하여 작성되었습니다.
먼저, 예시로 아래와 같은 간단한 그래프를 그리는 상황을 가정해 보겠습니다.
import matplotlib.pyplot as plt
data = [8, 10, 13, 15, 16, 17, 108, 113, 115]
plt.plot(data, 'ro--')
plt.show()
y축의 값이 0~20 정도의 범위와 100~120 정도의 범위로 이분화되어있는 상황입니다.
Step 1. 그래프 분리
축 절단으로 물결선 효과를 주려면 우선 두 범위의 그래프를 분리해야 하며, 여기서
한 figure 내에 두 개의 subplot으로 같은 그래프를 y축 범위만 다르게해서 그려야 합니다.
예시 코드는 다음과 같습니다.(각 줄 코드의 상세 설명은 주석을 참고하세요.)
fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True) # 그래프 두 개를 한 figure 내에 그리기
fig.subplots_adjust(hspace = 0.05) # 두 그래프 사이의 상하 간격 설정
# 각각의 그래프 그리기
ax1.plot(data, 'ro--')
ax2.plot(data, 'ro--')
ax1.set_ylim(100, 120) # 윗 부분 y축 범위 설정
ax2.set_ylim(0, 20) # 아랫 부분 y축 범위 설정
plt.show()
반응형
Step 2. 경계선 제거
이제 두 그래프의 경계선을 제거해보도록 하겠습니다.
위 Step 1의 코드에서 아래와 같이 코드 몇 줄을 추가해주시면 됩니다.
fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True) # 그래프 두 개를 한 figure 내에 그리기
fig.subplots_adjust(hspace = 0.05) # 두 그래프 사이의 상하 간격 설정
# 각각의 그래프 그리기
ax1.plot(data, 'ro--')
ax2.plot(data, 'ro--')
ax1.set_ylim(100, 120) # 윗 부분 y축 범위 설정
ax2.set_ylim(0, 20) # 아랫 부분 y축 범위 설정
# 두 그래프 사이의 경계선 제거
ax1.spines['bottom'].set_visible(False)
ax2.spines['top'].set_visible(False)
ax1.xaxis.tick_top()
ax1.tick_params(labeltop=False)
ax2.xaxis.tick_bottom()
plt.show()
Step 3. 물결선 효과 마커 넣기
이제 절단된 축에 물결선과 유사한 효과를 낼 수 있는 마커를 추가해 보겠습니다.
Step 2의 코드에서 다음과 같이 간단한 코드를 추가하여 마커를 그려볼 수 있습니다.
fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True) # 그래프 두 개를 한 figure 내에 그리기
fig.subplots_adjust(hspace = 0.05) # 두 그래프 사이의 상하 간격 설정
# 각각의 그래프 그리기
ax1.plot(data, 'ro--')
ax2.plot(data, 'ro--')
ax1.set_ylim(100, 120) # 윗 부분 y축 범위 설정
ax2.set_ylim(0, 20) # 아랫 부분 y축 범위 설정
# 두 그래프 사이의 경계선 제거
ax1.spines['bottom'].set_visible(False)
ax2.spines['top'].set_visible(False)
ax1.xaxis.tick_top()
ax1.tick_params(labeltop=False)
ax2.xaxis.tick_bottom()
# 두 그래프 사이의 y축에 물결선 효과 마커 표시
kwargs = dict(marker=[(-1, -0.5), (1, 0.5)], markersize=12,
linestyle="none", color='k', mec='k', mew=1, clip_on=False)
ax1.plot([0, 1], [0, 0], transform=ax1.transAxes, **kwargs)
ax2.plot([0, 1], [1, 1], transform=ax2.transAxes, **kwargs)
plt.show()
비슷한 원리를 적용하여 x축 측면에서도 절단 및 물결선 마커를 표시할 수 있습니다.
'Python > Matplotlib' 카테고리의 다른 글
[Matplotlib] 파이썬 그래프 축 로그 스케일 지정 - xscale, yscale (0) | 2022.10.07 |
---|---|
[Matplotlib] 파이썬 산점도 텍스트 label 추가 방법 (7) | 2022.08.24 |
[Matplotlib] 파이썬 그래프 회전 방법 예제 (1) | 2022.08.09 |