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

matplotlib mplot3d에서 선택한 객체의 속성(좌표)을 가져오는 방법

matplotlib의 mplot3d로 만든 3D 그래프에서 마우스로 선택한 객체(pick된 객체)의 속성, 즉 x, y, z 좌표를 확인하고 싶다면 pick_event를 활용하면 됩니다. 이 글에서는 산점도(scatter plot)의 데이터 포인트를 클릭했을 때 해당 점의 좌표를 콘솔에 출력하는 예제를 단계별로 살펴보겠습니다.

구현 순서

  • 그림 크기를 설정하고 서브플롯 주변 및 사이의 여백(padding)을 조정합니다.

  • 새 figure를 생성하거나 기존 figure를 활성화합니다.

  • 서브플롯 배치의 일부로 figure에 3D 축(ax)을 추가합니다.

  • 무작위 데이터 포인트로 산점도(scatter plot)를 그립니다. 이때 picker=5 옵션을 지정해 클릭 이벤트가 감지되는 범위를 설정합니다.

  • 사용자 정의 함수 pick_event_methodpick_event 이벤트에 연결(bind)합니다.

  • 선택된 점의 x, y, z 좌표를 콘솔에 출력합니다.

  • 그래프를 화면에 표시하기 위해 plt.show() 메서드를 호출합니다.

전체 예제 코드

import matplotlib.pyplot as plt
import numpy as np

plt.rcParams["figure.figsize"] = [7.00, 3.50]
plt.rcParams["figure.autolayout"] = True

fig = plt.figure()

# 3D 축 추가
ax = fig.add_subplot(111, projection='3d')

# 산점도 그리기 (picker=5 : 클릭 판정 반경)
ax.scatter(np.random.rand(10), np.random.rand(10), np.random.rand(10), c=np.random.rand(10),
           cmap='hot', picker=5, s=100)


# pick 이벤트 발생 시 실행될 함수
def pick_event_method(event):
    ind = event.ind[0]
    x, y, z = event.artist._offsets3d
    print(x[ind], y[ind], z[ind])


# pick_event_method 함수와 pick_event 이벤트를 연결
fig.canvas.mpl_connect('pick_event', pick_event_method)

plt.show()

실행 결과

위 코드를 실행하면 다음과 같은 3D 산점도가 나타납니다.

matplotlib mplot3d에서 선택한 객체의 속성(좌표)을 가져오는 방법

이 상태에서 그래프 위의 데이터 포인트를 클릭해 보세요. 클릭한 점의 x, y, z 좌표가 콘솔에 순서대로 출력됩니다.

0.29471404722373373 0.7272382336952506 0.551701540876738
0.7393059098968329 0.880733225356321 0.20733995579556608
0.4055966753557102 0.9709122739514328 0.10116103589732084
0.2781962334047674 0.48531626106129566 0.8573607199598575

핵심 포인트 정리

  • picker 옵션: 산점도 생성 시 picker=5처럼 값을 지정하면, 클릭 위치에서 해당 픽셀 반경 이내에 있는 점들이 pick 대상으로 인식됩니다.

  • event.ind: pick 이벤트가 발생하면 event.ind에 선택된 데이터 포인트의 인덱스 배열이 담깁니다. 여러 점이 동시에 선택될 수 있으므로 첫 번째 인덱스(ind[0])를 사용했습니다.

  • _offsets3d: 3D 산점도 아티스트(artist)의 내부 속성으로, 모든 점의 x, y, z 좌표 배열을 튜플 형태로 가지고 있습니다. 이를 통해 선택된 인덱스에 해당하는 실제 좌표값을 얻을 수 있습니다.

  • mpl_connect: fig.canvas.mpl_connect('pick_event', 콜백함수) 형태로 이벤트와 처리 함수를 연결하면, 사용자의 상호작용에 따라 원하는 로직을 실행할 수 있습니다.

이 방식은 3D 시각화 결과에서 특정 데이터를 대화형으로 탐색하거나, 클릭한 지점에 대한 상세 정보를 표시하는 등의 인터랙티브 기능을 구현할 때 유용하게 활용할 수 있습니다.