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

Matplotlib에서 마스킹된 산점도를 그리고 마스킹된 영역 경계선 추가하는 방법

데이터 시각화를 하다 보면 특정 조건에 해당하는 데이터 포인트만 표시하거나, 마스킹된 영역의 경계를 명확하게 구분해야 하는 경우가 있습니다. Matplotlib에서는 numpy.ma 모듈과 scatter(), plot() 메서드를 활용하여 이러한 작업을 손쉽게 수행할 수 있습니다.

구현 단계

  • 그림(figure) 크기를 설정하고 서브플롯 간의 여백(padding)을 조정합니다.
  • NumPy를 사용하여 N, r0, x, y, area, c, r, area1, area2 데이터 포인트를 생성합니다.
  • scatter() 메서드로 x, y 데이터 포인트를 산점도 형태로 그립니다.
  • 마스킹된 영역의 경계를 나타내기 위해 plot() 메서드로 곡선을 그립니다.
  • show() 메서드를 사용하여 그림을 화면에 출력합니다.

예제 코드

import matplotlib.pyplot as plt
import numpy as np

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

N = 100
r0 = 0.6
x = 0.9 * np.random.rand(N)
y = 0.9 * np.random.rand(N)
area = (20 * np.random.rand(N))**2
c = np.sqrt(area)

r = np.sqrt(x ** 2 + y ** 2)
area1 = np.ma.masked_where(r < r0, area)
area2 = np.ma.masked_where(r >= r0, area)
plt.scatter(x, y, s=area1, marker='^', c=c)
plt.scatter(x, y, s=area2, marker='o', c=c)
theta = np.arange(0, np.pi / 2, 0.01)
plt.plot(r0 * np.cos(theta), r0 * np.sin(theta))

plt.show()

코드 설명

위 코드에서 핵심 부분은 다음과 같습니다.

  • r = np.sqrt(x ** 2 + y ** 2): 원점으로부터 각 점까지의 거리를 계산합니다.
  • np.ma.masked_where(r < r0, area): 반지름이 r0보다 작은 영역의 값을 마스킹하여 해당 포인트가 첫 번째 산점도에 표시되지 않도록 합니다.
  • np.ma.masked_where(r >= r0, area): 반대로 반지름이 r0 이상인 영역을 마스킹하여 두 번째 산점도에서 제외합니다.
  • 마커를 각각 삼각형('^')과 원('o')으로 다르게 지정하여 두 영역을 시각적으로 구분할 수 있습니다.
  • theta 배열을 이용해 반지름 r0인 4분원 호를 그려서 마스킹된 영역의 경계를 명확히 표시합니다.

실행 결과

코드를 실행하면 원점을 중심으로 한 반경 0.6(r0)의 경계선이 그려지고, 경계 안쪽과 바깥쪽의 데이터 포인트가 서로 다른 마커로 구분되어 표시됩니다. 색상(c)은 각 점의 크기(area)에 따라 결정되므로, 점의 크기와 색 농도가 비례하여 표현됩니다.