데이터 시각화를 하다 보면 특정 조건에 해당하는 데이터 포인트만 표시하거나, 마스킹된 영역의 경계를 명확하게 구분해야 하는 경우가 있습니다. 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)에 따라 결정되므로, 점의 크기와 색 농도가 비례하여 표현됩니다.