본문 바로가기
데이터 분석/시각화

[Matplotlib] Tip! add_patch와 PatchCollection 비교

by 부자 꽁냥이 2023. 1. 4.

안녕하세요~ 꽁냥이에요. Matplotlib에서는 Patch라는 개념이 있는데요. 이는 도형이라고 생각하면 됩니다. 이러한 Patch를 추가할 때에는 add_patch를 사용하는데요. 만약 수많은 Patch를 추가한다면 add_patch 보다는 PatchCollection으로 한데 모아서 한 번에 추가하는 게 속도가 더 빨라집니다. 

 

이번 포스팅에서는 add_patch와 PatchCollection의 사용법과 여러 도형을 추가할 때 속도 측면에서 어떤지 비교 실험을 해보겠습니다.


   add_patch와 PatchCollection 비교

1) Patch가 하나인 경우

여기서는 Patch를 Rectangle(사각형)으로 한정하여 실험해보겠습니다. 먼저 필요한 모듈을 임포트 합니다.

 

import matplotlib.pyplot as plt
import time

from matplotlib.patches import Rectangle
from matplotlib.collections import PatchCollection

 

먼저 add_patch를 이용하여 좌하단 좌표가 (0, 0), 가로 세로 길이가 모두 0.5인 사각형 하나를 추가해 보겠습니다.

 

start = time.time()
fig = plt.figure()
fig.set_facecolor('white')
ax = fig.add_subplot()
ax.add_patch(Rectangle((0, 0), 0.5, 0.5, facecolor='none', edgecolor='k', linewidth=0.5))
print(time.time()-start)
plt.show()

 

코드를 실행하면 사각형이 추가된 것을 알 수 있고 시간은 약 0.01496초가 걸렸습니다. 이번엔 같은 것을 PatchCollection을 사용하여 속도를 측정해 보겠습니다. PatchCollection은 Patch를 원소로 하는 리스트를 첫 번째 인자로 받습니다. 이때 match_original=True로 하여 Rectangle에서 설정한 디자인(배경색, 테두리 색, 테두리 두께 등)을 그대로 가져오도록 했습니다. 또한 PatchCollection을 추가하기 위하여 add_collection을 사용하는 것을 주목하세요.

 

start = time.time()
fig = plt.figure()
fig.set_facecolor('white')
ax = fig.add_subplot()

rectangle = []
rect = Rectangle((0, 0), 0.5, 0.5, facecolor='none', edgecolor='k', linewidth=0.5)
rectangle.append(rect)

ax.add_collection(PatchCollection(rectangle, match_original=True))
print(time.time()-start)
plt.show()

 

결과는 똑같지만 속도는 약 0.01895초로 add_patch를 사용할 때보다 조금 느리다는 것을 알 수 있습니다.


2) Patch가 여러 개인 경우

그렇다면 PatchCollection은 별로 쓸모가 없는 것일까요? 

 

그렇지 않습니다. Patch가 여러개인 경우에는 PatchCollection을 사용하는 것이 더 빠릅니다.

 

200개 사각형을 추가할 때의 속도를 확인해 보겠습니다. 먼저 add_patch를 사용해 보겠습니다.

 

start = time.time()
fig = plt.figure()
fig.set_facecolor('white')
ax = fig.add_subplot()
ax.set_xlim((0, 10))
ax.set_ylim((0, 20))
for l in range(10):
    for b in range(20):
        rect = Rectangle((l, b), 0.5, 0.5, facecolor='none', edgecolor='k', linewidth=0.5)
        ax.add_patch(rect)
print(time.time()-start)
plt.show()

 

 

위 코드를 실행하면 200개의 사각형이 추가되는 시간은 약 0.09577초입니다. 그렇다면 PatchCollection을 이용하면 어떻게 될까요?

 

start = time.time()
fig = plt.figure()
fig.set_facecolor('white')
ax = fig.add_subplot()
ax.set_xlim((0, 10))
ax.set_ylim((0, 20))
rectangle = []

for l in range(10):
    for b in range(20):
        rect = Rectangle((l, b), 0.5, 0.5, facecolor='none', edgecolor='k', linewidth=0.5)
        rectangle.append(rect)

ax.add_collection(PatchCollection(rectangle, match_original=True))
print(time.time()-start)
plt.show()

 

그림은 동일하게 나오지만 속도가 약 0.03587초로 약 3배 가까이 빨라졌습니다.


이번 포스팅을 통해 Patch가 소량일 때에는 add_patch를 대량일 때에는 PatchCollection을 사용하여 추가하는 것이 더 유리하다는 것을 알려드리고 싶었습니다. 오늘 내용이 잘 사용되지는 않겠지만 꽁냥이가 추후에 또 사용할 수 있어서 끄적여보았습니다 ㅎㅎ;;

 

혹시라도 이번 포스팅이 어떤 분들께 도움이 되셨으면 좋겠어요. 지금까지 꽁냥이의 글 읽어주셔서 감사합니다.


댓글


맨 위로