Matplotlib으로 생성한 산점도(scatterplot)의 픽셀 좌표를 얻으려면 다음 단계를 따르면 됩니다.
단계별 절차
- 그림(figure) 크기를 설정하고 서브플롯 사이 및 주변의 여백(padding)을 조정합니다.
- 샘플 데이터 개수를 저장할 변수 n을 초기화합니다.
- Figure와 서브플롯 집합을 생성합니다.
- 산점도를 그립니다.
- get_data() 메서드를 사용하여 x, y 데이터 포인트를 가져옵니다.
- 플롯의 픽셀 값을 계산합니다.
- 데이터 좌표를 픽셀 좌표로 변환(transform)합니다.
- 포인트 또는 픽셀 단위로 그림의 너비와 높이를 가져옵니다.
- x, y 픽셀 값을 출력합니다.
- 그림을 화면에 표시하려면 show() 메서드를 사용합니다.
예제 코드
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams["figure.figsize"] = [7.00, 3.50]
plt.rcParams["figure.autolayout"] = True
n = 10
fig, ax = plt.subplots()
points, = ax.plot(np.random.random(n), np.random.random(n), 'r*')
x, y = points.get_data()
pixels = ax.transData.transform(np.vstack([x, y]).T)
x, y = pixels.T
width, height = fig.canvas.get_width_height()
y = height - y
print("The pixel coordinates are: ")
for xp, yp in zip(x, y):
print('{x:0.2f}\t{y:0.2f}'.format(x=xp, y=yp))
plt.show()코드 설명
위 코드의 핵심은 ax.transData.transform() 메서드입니다. 이 메서드는 데이터 좌표계(data coordinates)의 점들을 디스플레이 좌표계, 즉 픽셀 좌표로 변환해 줍니다. 변환된 좌표는 캔버스의 왼쪽 하단을 기준으로 하므로, 일반적인 이미지 좌표 체계(왼쪽 상단 기준)와 일치시키기 위해 y값을 height - y로 뒤집어 주는 과정이 필요합니다.
출력 결과
위 코드를 실행하면 산점도가 그려진 그림과 함께, 콘솔에 각 데이터 포인트의 픽셀 좌표가 출력됩니다.
The pixel coordinates are: 564.93 161.83 446.27 112.60 153.39 247.65 236.90 258.34 519.10 301.04 237.66 118.16 149.71 303.29 386.74 105.81 172.93 121.81 110.94 116.20
이처럼 transData 변환을 활용하면 Matplotlib 플롯 위의 임의의 데이터 포인트가 실제 화면상 어느 픽셀 위치에 해당하는지 정확하게 알아낼 수 있습니다. 이는 이미지 처리, 마우스 이벤트 처리, 주석(annotation) 자동 배치 등 다양한 응용에 유용하게 활용됩니다.