はじめに
Matplotlib は Python のデータ可視化ライブラリです。.inset_locator機能を使うと、軸の角にインセットを簡単に配置できます。この実験では、Matplotlib のプロットにインセットを作成するために.inset_locator機能をどのように使うかを調べます。
VM のヒント
VM の起動が完了したら、左上隅をクリックしてノートブックタブに切り替え、Jupyter Notebook を使って練習しましょう。
時々、Jupyter Notebook が読み込み終わるまで数秒待つ必要があります。Jupyter Notebook の制限により、操作の検証を自動化できません。
学習中に問題がある場合は、Labby にお問い合わせください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。
2 つのサブプロット付きのグラフを作成する
まず、2 つのサブプロット付きのグラフを作成する必要があります。2 つのサブプロットを横並びに配置したグラフを作成するには、plt.subplots() メソッドを使用します。
import matplotlib.pyplot as plt
fig, (ax, ax2) = plt.subplots(1, 2, figsize=[5.5, 2.8])
インセット軸を作成する
次に、各サブプロットにインセット軸を作成します。インセット軸を作成するには、inset_axes() メソッドを使用します。異なるサイズと位置の 4 つのインセットを作成します。
from mpl_toolkits.axes_grid1.inset_locator import inset_axes
## 幅 1.3 インチ、高さ 0.9 インチのインセットを
## 既定の右上の位置に作成する
axins = inset_axes(ax, width=1.3, height=0.9)
## 親軸のバウンディングボックスの幅の 30%、高さの 40% のインセットを
## 左下隅 (loc=3) に作成する
axins2 = inset_axes(ax, width="30%", height="40%", loc=3)
## 2 番目のサブプロットに混合仕様のインセットを作成する;
## 幅は親軸のバウンディングボックスの 30% で
## 高さは 1 インチで左上隅 (loc=2) に作成する
axins3 = inset_axes(ax2, width="30%", height=1., loc=2)
## 右下隅 (loc=4) にボーダーパッドを 1 としてインセットを作成する、つまり
## 親軸に対して 10 ポイントのパディング (10pt が既定のフォントサイズなので) を持つ
axins4 = inset_axes(ax2, width="20%", height="20%", loc=4, borderpad=1)
目盛りラベルを非表示にする
各インセットから目盛りラベルを削除するには、tick_params() メソッドを使用して、labelleft と labelbottom を False に設定できます。
## インセットの目盛りラベルを非表示にする
for axi in [axins, axins2, axins3, axins4]:
axi.tick_params(labelleft=False, labelbottom=False)
インセットの位置とサイズを制御する
インセットの位置とサイズを制御するには、bbox_to_anchor と bbox_transform パラメータを使用できます。これらのパラメータを使うと、インセットの位置とサイズを微調整でき、また、インセットをまったく任意の位置に配置することもできます。
## バウンディングボックスの変換として軸の変換を使用します。したがって、
## バウンディングボックスは軸座標で指定する必要があります ((0, 0) は軸の左下隅、
## (1, 1) は右上隅)。
## バウンディングボックス (.2,.4,.6,.5) は (.2,.4) から始まり、
## それらの座標では (.8,.9) まで範囲を持ちます。
## このバウンディングボックスの中で、バウンディングボックスの幅の半分と
## 高さの 4 分の 3 のインセットが作成されます。インセットの左下隅は
## バウンディングボックスの左下隅に揃えられます (loc=3)。
## その後、インセットは既定のフォントサイズの 0.5 単位でオフセットされます。
axins = inset_axes(ax, width="50%", height="75%",
bbox_to_anchor=(.2,.4,.6,.5),
bbox_transform=ax.transAxes, loc=3)
任意の位置にインセットを作成する
bbox_to_anchor パラメータを使ってデータ座標でのバウンディングボックスを指定し、bbox_transform パラメータを使ってバウンディングボックスの変換を指定することで、任意の位置にインセットを作成できます。
## ax.transData を変換として使用してデータ座標でインセットを作成する
axins3 = inset_axes(ax2, width="100%", height="100%",
bbox_to_anchor=(1e-2, 2, 1e3, 3),
bbox_transform=ax2.transData, loc=2, borderpad=0)
軸の外にインセットを作成する
bbox_to_anchor パラメータを使って軸の外に広がる軸座標でのバウンディングボックスを指定することで、軸の外にインセットを作成できます。
## 軸の外にインセットを作成する
axins = inset_axes(ax, width="100%", height="100%",
bbox_to_anchor=(1.05,.6,.5,.4),
bbox_transform=ax.transAxes, loc=2, borderpad=0)
2 要素のタプルで構成されるバウンディングボックスを持つインセットを作成する
インセットの幅と高さをインチで指定し、bbox_to_anchor パラメータを使ってインセットの左下隅を指定することで、2 要素のタプルで構成されるバウンディングボックスを持つインセットを作成できます。
## 2 要素のタプルで構成されるバウンディングボックスを持つインセットを作成する。これは、範囲を持たないバウンディングボックスを作成します。
## したがって、これは絶対単位(インチ)で幅と高さを指定する場合にのみ意味があります。
axins2 = inset_axes(ax, width=0.5, height=0.4,
bbox_to_anchor=(0.33, 0.25),
bbox_transform=ax.transAxes, loc=3, borderpad=0)
グラフ座標で中央に配置されたインセットを作成する
blended_transform_factory() メソッドを使って混合変換を作成し、それを bbox_transform パラメータとして使用することで、グラフ座標で水平方向に中央に配置され、垂直方向には軸と整列するように制限されたインセットを作成できます。
## グラフ座標で水平方向に中央に配置され、垂直方向には軸と整列するように制限されたインセットを作成する。
from matplotlib.transforms import blended_transform_factory
transform = blended_transform_factory(fig.transFigure, ax2.transAxes)
axins4 = inset_axes(ax2, width="16%", height="34%",
bbox_to_anchor=(0, 0, 1, 1),
bbox_transform=transform, loc=8, borderpad=0)
まとめ
この実験では、Matplotlib の.inset_locator機能を使ってグラフにインセットを作成する方法を学びました。異なるサイズと位置のインセットを作成し、インセットの位置とサイズを制御し、任意の位置のインセットを作成しました。また、軸の外のインセット、2 要素のタプルで構成されるバウンディングボックスを持つインセット、グラフ座標で中央に配置されたインセットも作成しました。