プログラムでサブプロットの調整を制御する

Beginner

This tutorial is from open-source community. Access the source code

はじめに

Matplotlib は、Python でグラフを作成するための強力なライブラリです。時々、グラフを作成する際に、サブプロットのパラメータを手動で調整する必要がある場合があります。この実験では、ラベルのサイズに基づいてサブプロットのパラメータをプログラムで調整する方法を示します。

VM のヒント

VM の起動が完了したら、左上隅をクリックしてノートブックタブに切り替え、Jupyter Notebook を使って練習しましょう。

時々、Jupyter Notebook が読み込み終わるまで数秒待つ必要がある場合があります。Jupyter Notebook の制限により、操作の検証を自動化することはできません。

学習中に問題に遭遇した場合は、Labby にお問い合わせください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。

必要なライブラリをインポートする

グラフを作成してサブプロットのパラメータを操作するには、matplotlib.pyplotmatplotlib.transforms が必要です。

import matplotlib.pyplot as plt
import matplotlib.transforms as mtransforms

グラフを作成する

長い y 軸のラベル付きの単純な折れ線グラフを作成しましょう。

fig, ax = plt.subplots()
ax.plot(range(10))
ax.set_yticks([2, 5, 7], labels=['really, really, really', 'long', 'labels'])

描画コールバック関数を定義する

グラフが描画されるたびに呼び出される関数を定義します。この関数は、y 軸のラベルの境界ボックスを計算し、サブプロットがラベルに十分なスペースを残しているかどうかを判断し、必要に応じてサブプロットのパラメータを調整します。

def on_draw(event):
    bboxes = []
    for label in ax.get_yticklabels():
        ## ピクセル単位の境界ボックス
        bbox_px = label.get_window_extent()
        ## 相対的なグラフ座標に変換します。これは transFigure の逆変換です。
        bbox_fig = bbox_px.transformed(fig.transFigure.inverted())
        bboxes.append(bbox_fig)
    ## すべての bbox を囲む bbox、再び相対的なグラフ座標で
    bbox = mtransforms.Bbox.union(bboxes)
    if fig.subplotpars.left < bbox.width:
        ## サブプロットの左辺を右にもっと移動させます
        fig.subplots_adjust(left=1.1*bbox.width)  ## 少し余白を空けます
        fig.canvas.draw()

描画イベントをコールバック関数に接続する

draw_eventon_draw 関数に接続する必要があります。

fig.canvas.mpl_connect('draw_event', on_draw)

グラフを表示する

最後に、グラフを表示します。

plt.show()

まとめ

この実験では、ラベルのサイズに基づいてプログラムでサブプロットのパラメータを調整する方法を学びました。matplotlib.transforms モジュールを使ってラベルの境界ボックスを計算し、draw_event を使って on_draw 関数を呼び出しました。