Matplotlib에서 수천 개의 원을 빠르게 그리려면 matplotlib.collections 모듈을 활용해야 합니다. 특히 이 글에서는 CircleCollection 클래스를 사용하여 대량의 원을 효율적으로 렌더링하는 방법을 소개합니다.
구현 단계
- matplotlib에서 collections 패키지를 가져오고, 함께 pyplot과 numpy도 임포트합니다.
- 그림(figure) 크기를 설정하고 서브플롯 주변의 여백(padding)을 조정합니다.
- 작은 원의 개수를 나타내는 변수 "num"과 원의 크기를 담을 변수 "sizes"를 초기화합니다.
- 원 패치(circle patch) 목록을 생성합니다.
- 현재 축(axis)에 원 패치 아티스트를 추가합니다.
- 축의 마진(margins)을 설정합니다.
- show() 메서드를 호출하여 그림을 화면에 표시합니다.
예제 코드
import numpy as np import matplotlib.pyplot as plt import matplotlib.collections as mc plt.rcParams["figure.figsize"] = [7.50, 3.50] plt.rcParams["figure.autolayout"] = True num = 1000 sizes = 50 * np.random.random(num) xy = 10 * np.random.random((num, 2)) patches = [plt.Circle(center, size) for center, size in zip(xy, sizes)] fig, ax = plt.subplots() collection = mc.CircleCollection(sizes, offsets=xy, transOffset=ax.transData, color='green') ax.add_collection(collection) ax.margins(0.01) plt.show()
실행 결과
위 코드를 실행하면 다음과 같은 출력 결과를 얻을 수 있습니다.


핵심 포인트 정리
개별 원을 하나씩 plt.Circle()로 추가하는 방식은 원의 개수가 많아질수록 렌더링 속도가 크게 느려집니다. 반면 CircleCollection은 모든 원을 하나의 컬렉션 객체로 묶어 한 번에 그리기 때문에 수천 개 이상의 원을 그릴 때 성능상 큰 이점을 제공합니다. offsets 매개변수에 각 원의 중심 좌표 배열을 전달하고, transOffset=ax.transData로 데이터 좌표계를 지정하면 됩니다.