Matplotlib에서 두 원 또는 패치(patch)가 겹치는 교차 영역을 색칠하고 싶다면, Shapely라는 기하학 라이브러리를 함께 활용하는 것이 가장 효과적입니다. Shapely는 도형의 합집합, 차집합, 교집합 등의 연산을 손쉽게 처리할 수 있게 해주며, 이 결과를 descartes 모듈을 통해 Matplotlib 패치로 변환하여 시각화할 수 있습니다.
전체 과정은 다음 단계로 진행됩니다.
- 그림(figure) 크기를 설정하고 서브플롯 주변 및 사이의 여백(padding)을 조정합니다.
- Shapely의
Point객체에 버퍼(buffer)를 적용해 원 형태의 도형 a와 b를 생성합니다. difference()와intersection()연산을 사용해 두 도형으로부터 왼쪽, 오른쪽, 가운데 영역을 각각 계산합니다.gca()메서드로 현재 축(axes)을 가져옵니다.- 영역마다 다른 색상을 지정한 패치를 추가합니다.
- X축과 Y축의 표시 범위를 설정합니다.
set_aspect('equal')로 가로세로 비율을 동일하게 맞춰 원이 찌그러지지 않도록 합니다.axis('off')로 축을 숨깁니다.show()메서드를 호출해 최종 그림을 화면에 표시합니다.
핵심 개념 정리
이 예제에서 사용되는 Shapely의 주요 연산은 다음과 같습니다.
- difference(a, b): 도형 a에서 b와 겹치는 부분을 제외한 나머지 영역을 반환합니다.
- intersection(a, b): 두 도형이 겹치는 공통 영역만 반환합니다.
즉, 왼쪽 영역은 a.difference(b), 오른쪽 영역은 b.difference(a), 가운데 교차 영역은 a.intersection(b)으로 구할 수 있습니다.
예제 코드
import shapely.geometry as sg
import matplotlib.pyplot as plt
import descartes
plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True
# 반지름 1인 두 개의 원 생성
a = sg.Point(-.5, 0).buffer(1.)
b = sg.Point(0.5, 0).buffer(1.)
# 왼쪽, 오른쪽, 가운데(교차) 영역 계산
left = a.difference(b)
right = b.difference(a)
middle = a.intersection(b)
ax = plt.gca()
ax.add_patch(descartes.PolygonPatch(left, fc='b', ec='k'))
ax.add_patch(descartes.PolygonPatch(right, fc='r', ec='k'))
ax.add_patch(descartes.PolygonPatch(middle, fc='g', ec='k'))
ax.set_xlim(-2, 2)
ax.set_ylim(-2, 2)
ax.set_aspect('equal')
ax.axis('off')
plt.show()실행 결과
코드를 실행하면 파란색 왼쪽 영역, 빨간색 오른쪽 영역, 그리고 초록색 가운데 교차 영역으로 구성된 벤 다이어그램(Venn diagram) 형태의 그림이 출력됩니다. 축이 숨겨져 있어 깔끔한 도형만 화면에 나타납니다.
이 방식은 집합 관계를 시각화하거나, 지리 데이터의 겹치는 영역을 강조하는 등 다양한 상황에서 응용할 수 있습니다.