Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Matplotlib 사각형 가장자리를 지정된 너비만큼 외부로 설정하는 방법

Matplotlib에서 사각형의 가장자리(테두리)를 지정된 선 두께만큼 도형 바깥쪽에 그리고 싶다면, AnnotationBboxAuxTransformBox를 조합하는 방법이 효과적입니다. 일반적인 Rectangle 패치는 테두리가 경계선을 중심으로 안과 밖에 절반씩 걸쳐 그려지기 때문에, 이 기법을 활용하면 테두리 전체를 사각형 외부로 밀어낼 수 있습니다.

구현 단계

  1. 그림(figure) 크기를 설정하고 서브플롯 사이 및 주변의 여백을 조정합니다.
  2. 새 그림을 생성하거나 기존 그림을 활성화합니다.
  3. 서브플롯 배치의 일부로 축(ax)을 그림에 추가합니다.
  4. 사각형 테두리 두께를 지정할 변수 line_width를 초기화하고, 사각형의 앵커 좌표(xy), 너비(w), 높이(h) 변수를 정의합니다.
  5. 앵커 포인트와 너비·높이를 기준으로 Rectangle 인스턴스를 생성합니다.
  6. 오프셋 변환 박스인 AuxTransformBox 인스턴스를 생성합니다.
  7. 앞서 만든 사각형 패치(r)를 아티스트로 추가합니다.
  8. OffsetBox 인스턴스를 담을 컨테이너를 구성합니다.
  9. 주석 상자(AnnotationBbox, ab)를 컨테이너 박스에 추가합니다.
  10. 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를 조절하면 테두리와 사각형 사이의 간격을 원하는 대로 맞출 수 있습니다.

출력 결과

코드를 실행하면 데이터 곡선 위에 초록색 사각형이 그려지고, 해당 사각형을 완전히 감싸는 두꺼운 빨간색 테두리가 바깥쪽에 표시되는 것을 확인할 수 있습니다.

Matplotlib 사각형 가장자리를 지정된 너비만큼 외부로 설정하는 방법Matplotlib 사각형 가장자리를 지정된 너비만큼 외부로 설정하는 방법