프로그래밍 방식으로 서브플롯 조정 제어 #

메모

이 예제는 주로 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()
자동 서브플롯 조정

Sphinx-Gallery에서 생성한 갤러리