はじめに
Matplotlib は、Python でグラフを作成するための強力なライブラリです。時々、グラフを作成する際に、サブプロットのパラメータを手動で調整する必要がある場合があります。この実験では、ラベルのサイズに基づいてサブプロットのパラメータをプログラムで調整する方法を示します。
VM のヒント
VM の起動が完了したら、左上隅をクリックしてノートブックタブに切り替え、Jupyter Notebook を使って練習しましょう。
時々、Jupyter Notebook が読み込み終わるまで数秒待つ必要がある場合があります。Jupyter Notebook の制限により、操作の検証を自動化することはできません。
学習中に問題に遭遇した場合は、Labby にお問い合わせください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。
必要なライブラリをインポートする
グラフを作成してサブプロットのパラメータを操作するには、matplotlib.pyplot と matplotlib.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_event を on_draw 関数に接続する必要があります。
fig.canvas.mpl_connect('draw_event', on_draw)
グラフを表示する
最後に、グラフを表示します。
plt.show()
まとめ
この実験では、ラベルのサイズに基づいてプログラムでサブプロットのパラメータを調整する方法を学びました。matplotlib.transforms モジュールを使ってラベルの境界ボックスを計算し、draw_event を使って on_draw 関数を呼び出しました。