메모
전체 예제 코드를 다운로드 하려면 여기 를 클릭 하십시오.
프로그래밍 방식으로 서브플롯 조정 제어 #
메모
이 예제는 주로 Matplotlib의 일부 고급 개념을 보여주기 위한 것입니다.
레이블을 위한 충분한 공간만 찾는 경우 를 사용하여 서브플롯 매개변수를 수동으로 설정 Figure.subplots_adjust
하거나 자동 레이아웃 메커니즘( Constrained Layout Guide 또는
Tight Layout guide ) 중 하나를 사용하는 것이 거의 항상 더 간단하고 좋습니다.
이 예는 아티스트 크기를 읽고 그에 따라 서브플롯 매개변수를 설정하는 사용자 정의 방법을 설명합니다. 주요 목적은 텍스트 위치 읽기, 경계 상자 및 변환 작업, 이벤트 사용과 같은 일부 고급 개념을 설명하는 것 입니다. 그러나 레이아웃을 자동화하고 타이트한 레이아웃과 제한된 레이아웃보다 더 많은 유연성이 필요한 경우 시작점 역할을 할 수도 있습니다.
아래에서 모든 y-레이블의 경계 상자를 수집하고 서브플롯의 왼쪽 테두리를 오른쪽으로 이동하여 모든 경계 상자의 결합을 위한 충분한 공간을 남깁니다.
텍스트 경계 상자를 계산하는 데 한 가지 문제가 있습니다. 텍스트 경계 상자( Text.get_window_extent
)를 쿼리하려면 텍스트 크기를 계산하기 위해 렌더러( RendererBase
인스턴스)가 필요합니다. 이 렌더러는 그림이 그려진 후에만 사용할 수 있습니다( Figure.draw
).
이에 대한 해결책은 조정 로직을 그리기 콜백에 넣는 것입니다. 이 함수는 그림이 그려진 후에 실행됩니다. 이제 서브플롯이 텍스트를 위한 충분한 공간을 남겨두는지 확인할 수 있습니다. 그렇지 않은 경우 서브플롯 매개변수가 업데이트되고 두 번째 그리기가 트리거됩니다.
import matplotlib.pyplot as plt
import matplotlib.transforms as mtransforms
fig, ax = plt.subplots()
ax.plot(range(10))
ax.set_yticks([2, 5, 7], labels=['really, really, really', 'long', 'labels'])
def on_draw(event):
bboxes = []
for label in ax.get_yticklabels():
# Bounding box in pixels
bbox_px = label.get_window_extent()
# Transform to relative figure coordinates. This is the inverse of
# transFigure.
bbox_fig = bbox_px.transformed(fig.transFigure.inverted())
bboxes.append(bbox_fig)
# the bbox that bounds all the bboxes, again in relative figure coords
bbox = mtransforms.Bbox.union(bboxes)
if fig.subplotpars.left < bbox.width:
# Move the subplot left edge more to the right
fig.subplots_adjust(left=1.1*bbox.width) # pad a little
fig.canvas.draw()
fig.canvas.mpl_connect('draw_event', on_draw)
plt.show()
참조
다음 함수, 메서드, 클래스 및 모듈의 사용이 이 예제에 표시됩니다.