Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Matplotlib 산점도에서 픽셀 좌표를 얻는 방법

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) 자동 배치 등 다양한 응용에 유용하게 활용됩니다.