Matplotlib에서 사각형의 가장자리(테두리)를 지정된 선 두께만큼 도형 바깥쪽에 그리고 싶다면, AnnotationBbox와 AuxTransformBox를 조합하는 방법이 효과적입니다. 일반적인 Rectangle 패치는 테두리가 경계선을 중심으로 안과 밖에 절반씩 걸쳐 그려지기 때문에, 이 기법을 활용하면 테두리 전체를 사각형 외부로 밀어낼 수 있습니다.
구현 단계
- 그림(figure) 크기를 설정하고 서브플롯 사이 및 주변의 여백을 조정합니다.
- 새 그림을 생성하거나 기존 그림을 활성화합니다.
- 서브플롯 배치의 일부로 축(ax)을 그림에 추가합니다.
- 사각형 테두리 두께를 지정할 변수
line_width를 초기화하고, 사각형의 앵커 좌표(xy), 너비(w), 높이(h) 변수를 정의합니다. - 앵커 포인트와 너비·높이를 기준으로
Rectangle인스턴스를 생성합니다. - 오프셋 변환 박스인
AuxTransformBox인스턴스를 생성합니다. - 앞서 만든 사각형 패치(r)를 아티스트로 추가합니다.
OffsetBox인스턴스를 담을 컨테이너를 구성합니다.- 주석 상자(
AnnotationBbox, ab)를 컨테이너 박스에 추가합니다. show()메서드를 호출하여 그림을 화면에 표시합니다.
예제 코드
import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle
from matplotlib.offsetbox import AnnotationBbox, AuxTransformBox
plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot([1, 6, 8, 6])
line_width = 7
xy, w, h = (1, 3), 2, 2
r = Rectangle(xy, w, h, fc='green', ec='orange', lw=3)
offsetbox = AuxTransformBox(ax.transData)
offsetbox.add_artist(r)
ab = AnnotationBbox(offsetbox, (xy[0] + w / 2, xy[1] + h / 2),
boxcoords="data", pad=0.52, fontsize=line_width,
bboxprops=dict(facecolor="none", edgecolor='r',
lw=line_width))
ax.add_artist(ab)
plt.show()동작 원리
핵심은 AnnotationBbox가 자신이 감싸는 오프셋 박스 주위에 별도의 프레임(bboxprops)을 그린다는 점입니다. 위 코드에서는 초록색 Rectangle 패치를 AuxTransformBox에 넣고, 이를 다시 AnnotationBbox로 감싸 두꺼운 빨간색 테두리(lw=line_width)를 바깥쪽에 그립니다. pad 값과 fontsize를 조절하면 테두리와 사각형 사이의 간격을 원하는 대로 맞출 수 있습니다.
출력 결과
코드를 실행하면 데이터 곡선 위에 초록색 사각형이 그려지고, 해당 사각형을 완전히 감싸는 두꺼운 빨간색 테두리가 바깥쪽에 표시되는 것을 확인할 수 있습니다.

