プログラムによるサブプロット調整の制御#

ノート

この例は、主に Matplotlib の高度な概念を示すことを目的としています。

ラベルに十分なスペースだけを探している場合は、ほとんどの場合、 を使用してサブプロット パラメーターを手動で設定するかFigure.subplots_adjust、自動レイアウト メカニズムのいずれか ( Constrained Layout Guideまたは Tight Layout guide ) を使用する方が簡単で十分です。

この例では、アーティストのサイズを読み取り、それに応じてサブプロット パラメーターを設定するユーザー定義の方法について説明します。その主な目的は、テキスト位置の読み取り、境界ボックスと変換の操作、 イベントの使用など、いくつかの高度な概念を説明することです。ただし、レイアウトを自動化したい場合や、タイトなレイアウトや制限されたレイアウトよりも柔軟性が必要な場合の出発点としても役立ちます。

以下では、すべての y ラベルの境界ボックスを収集し、サブプロットの左の境界線を右に移動して、すべての境界ボックスを結合するための十分なスペースを残します。

テキスト境界ボックスの計算には 1 つの問題があります。テキスト境界ボックス ( Text.get_window_extent) のクエリには、テキスト サイズを計算するためのレンダラー (RendererBaseインスタンス) が必要です。このレンダラーは、Figure が描画された後にのみ使用できます ( Figure.draw)。

これに対する解決策は、描画コールバックに調整ロジックを配置することです。この関数は、図形が描画された後に実行されます。サブプロットにテキスト用の十分なスペースがあるかどうかを確認できるようになりました。そうでない場合、サブプロット パラメーターが更新され、2 番目の描画がトリガーされます。

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 によって生成されたギャラリー