Matplotlib에서는 원호(Wedge)와 다각형(Polygon)을 조합하여 화살표가 빙글빙글 도는 순환(loop) 형태의 화살표를 쉽게 그릴 수 있습니다. 이 글에서는 단계별로 구현 방법을 살펴보겠습니다.
구현 단계
- 먼저 figure 크기를 설정하고, 서브플롯 주변과 사이의 여백(padding)을 조정합니다.
- 루프 화살표를 생성하는 make_loop() 함수를 정의합니다.
- 함수 내부에서 center(중심), radius(반지름), theta1, theta2(각도 범위), width(두께) 값을 이용해 Wedge(부채꼴) 인스턴스를 생성합니다.
- 루프 위쪽에 화살표 머리를 배치하기 위해 Polygon으로 삼각형 모양의 화살표를 만들고, PatchCollection을 사용해 결합합니다.
- 완성된 패치 컬렉션을 현재 축(ax)에 추가합니다.
- 마지막으로 show() 메서드를 호출해 그림을 화면에 표시합니다.
예제 코드
from matplotlib import pyplot as plt, patches, collections
plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True
def make_loop(center, radius, theta1=-30, theta2=180):
rwidth = 0.02
ring = patches.Wedge(center, radius, theta1, theta2, width=rwidth)
offset = 0.02
xcent = center[0] - radius + (rwidth / 2)
left = [xcent - offset, center[1]]
right = [xcent + offset, center[1]]
bottom = [(left[0] + right[0]) / 2., center[1] - 0.05]
arrow = plt.Polygon([left, right, bottom, left])
p = collections.PatchCollection(
[ring, arrow],
edgecolor='orange',
facecolor='red'
)
ax.add_collection(p)
fig, ax = plt.subplots()
make_loop(center=(.5, .7), radius=.1)
plt.show()코드 설명
make_loop() 함수는 중심 좌표와 반지름을 받아 두께가 얇은 부분 링(ring)을 만듭니다. theta1과 theta2 값으로 링의 시작 각도와 끝 각도를 지정할 수 있어, 열린 원호 형태의 루프가 그려집니다.
그다음 링의 왼쪽 끝단에 작은 삼각형 다각형을 배치해 화살표 머리를 표현합니다. 링과 화살표를 하나의 PatchCollection으로 묶으면 테두리 색(orange)과 채우기 색(red)을 한 번에 적용할 수 있어 코드가 깔끔해집니다.
실행 결과
위 코드를 실행하면 빨간색으로 채워진 부분 원형 루프와 함께, 시계 방향으로 흐르는 듯한 화살표가 표시됩니다. center와 radius, 각도 값을 조절하면 루프의 위치, 크기, 회전 범위를 자유롭게 변경할 수 있습니다.
이러한 순환 화살표는 프로세스 흐름도, 순환 참조 다이어그램, 반복 작업을 나타내는 시각화 등에 유용하게 활용됩니다.