Python/Matplotlib

[Matplotlib] 파이썬 그래프 y축 절단(물결선 효과) 적용 방법

jimmy_AI 2022. 10. 6. 20:53
반응형

Python plt broken axis

파이썬에서 matplotlib 모듈을 활용하여 그래프를 그릴 때,

축을 중간에서 절단하여 물결선과 비슷한 효과를 낼 수 있는 방법을 살펴보도록 하겠습니다.

 

참고로, 해당 글은 아래의 matplotlib 공식 사이트 글의 코드를 참고하여 작성되었습니다.

 

Broken Axis — Matplotlib 3.6.0 documentation

Note Click here to download the full example code Broken Axis Broken axis example, where the y-axis will have a portion cut out. import numpy as np import matplotlib.pyplot as plt np.random.seed(19680801) pts = np.random.rand(30)*.2 # Now let's make two ou

matplotlib.org

 

먼저, 예시로 아래와 같은 간단한 그래프를 그리는 상황을 가정해 보겠습니다.

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축 측면에서도 절단 및 물결선 마커를 표시할 수 있습니다.