개요
Matplotlib에서 축의 한 단위가 실제 화면에서 차지하는 길이(픽셀 단위)를 알아야 하는 경우가 있습니다. 데이터 좌표와 화면 좌표 간 변환이 필요하거나, 특정 크기의 요소를 그래프 위에 정확하게 배치하고 싶을 때 유용합니다. 이때 transData 변환을 활용하면 손쉽게 계산할 수 있습니다.
구현 단계
- 그림(figure) 크기를 설정하고 서브플롯 주변 및 사이의 여백을 조정합니다.
- NumPy를 사용하여 x, y 데이터 포인트를 생성합니다.
- figure() 메서드로 새 그림을 만들거나 기존 그림을 활성화합니다.
- 서브플롯 배치의 일부로 Axes(~.axes.Axes) 객체를 그림에 추가합니다.
- plot() 메서드로 x, y 데이터 포인트를 플롯합니다.
- 한 단위의 길이를 구하기 위해 transData 변환을 사용합니다.
- 가로 및 세로 길이를 콘솔에 출력합니다.
- show() 메서드로 그림을 화면에 표시합니다.
예제 코드
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True
x = np.arange(0, 10, 0.005)
y = np.exp(-x / 2.) * np.sin(2 * np.pi * x)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x, y)
xy = ax.transData.transform([(0, 1), (1, 0)])\
-ax.transData.transform((0, 0))
print("Vertical length:", xy[0][1])
print("Horizontal length: ", xy[1][0])
plt.show()
실행 결과

코드를 실행하면 감쇠 정현파 그래프가 그려지며, 그래프 외에 콘솔에는 다음과 같은 결과가 출력됩니다.
Vertical length: 269.5
Horizontal length: 581.25
동작 원리 설명
ax.transData는 데이터 좌표계를 디스플레이(픽셀) 좌표계로 변환해 주는 변환 객체입니다. 위 예제에서는 점 (0, 1)과 (1, 0)을 픽셀 좌표로 변환한 뒤 원점 (0, 0)의 픽셀 좌표를 빼줌으로써, y축 방향 한 단위의 세로 길이(269.5px)와 x축 방향 한 단위의 가로 길이(581.25px)를 계산했습니다.
참고로 이 값은 그림 크기, DPI, 축 범위 등에 따라 달라지므로, 동일한 코드라도 환경이나 설정이 다르면 출력값이 달라질 수 있습니다.