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

파이썬 Matplotlib 등고선 플롯에서 좌표값 추출하는 방법

파이썬 대표 시각화 라이브러리인 Matplotlib에서 plt.contour()로 그린 등고선의 실제 좌표값을 추출하는 방법을 소개합니다. 등고선은 내부적으로 Path(경로) 객체로 저장되기 때문에, 각 경로가 가진 정점(vertex) 정보만 확인하면 해당 등고선을 이루는 x, y 좌표를 모두 얻을 수 있습니다.

좌표 추출 단계

  1. figure.figsize로 그림(figure) 크기를 지정하고, figure.autolayout으로 서브플롯 사이와 주변의 여백을 자동 조정합니다.
  2. x, y 데이터 포인트와 각 격자 위치의 값 m으로 구성된 리스트를 준비합니다.
  3. plt.contour(x, y, m)을 호출하여 등고선 플롯을 생성합니다.
  4. 반환된 등고선 객체(cs)의 컬렉션(Collections) 인스턴스에 접근합니다.
  5. 각 컬렉션이 보유한 경로(Path)를 순회하면서 정점 배열(vertices)에서 x, y 좌표를 꺼내 출력합니다.
  6. plt.show() 메서드로 결과 그림을 화면에 표시합니다.

예제 코드

import matplotlib.pyplot as plt

# 그림 크기와 레이아웃 설정
plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True

# 데이터 준비
x = [1, 2, 3, 4]
y = [1, 2, 3, 4]
m = [[15, 14, 13, 12],
     [14, 12, 10, 8],
     [13, 10, 7, 4],
     [12, 8, 4, 0]]

# 등고선 플롯 생성
cs = plt.contour(x, y, m)

# 컬렉션을 순회하며 등고선 좌표 출력
for item in cs.collections:
    for i in item.get_paths():
        v = i.vertices
        x = v[:, 0]
        y = v[:, 1]
        print(x, y)

plt.show()

실행 결과

위 코드를 실행하면 다음과 같은 등고선 그래프가 화면에 그려집니다.

파이썬 Matplotlib 등고선 플롯에서 좌표값 추출하는 방법파이썬 Matplotlib 등고선 플롯에서 좌표값 추출하는 방법

동시에 터미널에는 각 등고선을 구성하는 정점들의 x, y 좌표가 레벨별로 순차적으로 출력됩니다.

[4.] [4.]
[4. 3.5] [3.5 4. ]
[4. 3.] [3. 4.]
[4.  3.33333333 3.   2.5 ] [2.5  3.   3.33333333 4.  ]
[4.  3. 2.66666667  2. ] [2.   2.66666667  3.  4. ]
[4. 3. 2. 1.5] [1.5 2. 3. 4. ]
[4. 3. 2.  1.33333333 1. ] [1. 1.33333333 2. 3. 4. ]
[2. 1.] [1. 2.]

참고: Matplotlib 3.8 이상 버전 사용자라면

cs.collections 속성은 Matplotlib 3.8부터 폐기(deprecated)되었으며, 3.10 버전부터는 완전히 제거되었습니다. 최신 버전에서는 아래와 같이 cs.get_paths() 또는 cs.allsegs를 사용하는 것을 권장합니다.

# 방법 1: get_paths() 사용
for path in cs.get_paths():
    v = path.vertices
    print(v[:, 0], v[:, 1])

# 방법 2: allsegs 사용 (레벨별 세그먼트 접근)
for level_segs in cs.allsegs:
    for seg in level_segs:
        print(seg[:, 0], seg[:, 1])

마무리

이렇게 등고선의 정점 좌표를 직접 추출하면 특정 값의 등고선이 지나가는 위치를 후속 계산에 활용하거나, 원하는 형식으로 데이터를 재가공할 수 있습니다. 시각화 자동화나 지리·과학 데이터 분석 작업에서 매우 유용하게 쓸 수 있는 기법이니 활용해 보시기 바랍니다.