개요
데이터 시각화를 하다 보면 단위나 값의 크기가 전혀 다른 두 개의 데이터를 하나의 그래프에 함께 표시해야 하는 경우가 자주 있습니다. 예를 들어, 지수 함수처럼 값이 급격히 커지는 데이터와 사인 함수처럼 -1과 1 사이에서 진동하는 데이터를 같은 그림에 나타내려면 각각 별도의 y축 척도가 필요합니다. Matplotlib에서는 twinx() 메서드를 사용해 X축을 공유하는 쌍둥이 축(twin Axes)을 만들어 이 문제를 손쉽게 해결할 수 있습니다.
구현 단계
- 그림(figure) 크기를 설정하고 서브플롯 사이 및 주변의 여백을 조정합니다.
- NumPy를 사용하여 t, data1, data2 데이터 포인트를 생성합니다.
- figure와 서브플롯 ax1을 생성합니다.
- 색상 변수를 초기화합니다.
- 첫 번째 축의 x 레이블과 y 레이블을 설정합니다.
- plot() 메서드로 t와 data1을 플롯합니다.
- tick_params() 메서드로 눈금 레이블의 색상을 설정합니다.
- X축을 공유하는 쌍둥이 축 ax2를 생성합니다.
- 두 번째 축에 다른 데이터셋으로 앞선 색상 설정, 플롯, 눈금 색상 설정 단계를 반복합니다.
- show() 메서드로 그림을 화면에 표시합니다.
예제 코드
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True
t = np.arange(0.01, 10.0, 0.01)
data1 = np.exp(t)
data2 = np.sin(2 * np.pi * t)
fig, ax1 = plt.subplots()
color = 'red'
ax1.set_xlabel('time (s)')
ax1.set_ylabel('exp', color=color)
ax1.plot(t, data1, color=color)
ax1.tick_params(axis='y', labelcolor=color)
ax2 = ax1.twinx()
color = 'blue'
ax2.set_ylabel('sin', color=color)
ax2.plot(t, data2, color=color)
ax2.tick_params(axis='y', labelcolor=color)
plt.show()실행 결과

위 코드를 실행하면 왼쪽 y축에는 빨간색으로 표시된 지수 곡선(exp)이, 오른쪽 y축에는 파란색으로 표시된 사인 곡선(sin)이 나타납니다. 두 곡선은 x축(시간)을 공유하지만 각각 독립적인 y축 척도를 사용하기 때문에, 값의 크기 차이가 매우 큰 두 데이터도 하나의 그래프에서 직관적으로 비교할 수 있습니다. 축 레이블과 눈금 색상을 곡선 색상과 일치시키면 어느 데이터가 어느 축에 해당하는지 한눈에 파악할 수 있어 가독성이 크게 향상됩니다.