はじめに
Matplotlib は、Python プログラミング言語のデータ可視化ライブラリです。これは、Python で静的、アニメーション、およびインタラクティブな可視化を作成するために使用されます。この実験では、Matplotlib のfill_between関数を使用して 2 つの線の間の領域を塗りつぶす方法を学びます。
VM のヒント
VM の起動が完了したら、左上隅をクリックしてノートブックタブに切り替え、Jupyter Notebook を開いて練習します。
場合によっては、Jupyter Notebook が読み込み終了するまで数秒待つ必要があります。Jupyter Notebook の制限により、操作の検証を自動化することはできません。
学習中に問題が発生した場合は、Labby にお問い合わせください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。
基本的な使い方
fill_between関数は、2 つの線の間の領域を塗りつぶすために使用できます。パラメータのy1とy2はスカラー値でもよく、指定された y 値における水平境界を示します。y1のみが与えられた場合、y2の既定値は 0 になります。
x = np.arange(0.0, 2, 0.01)
y1 = np.sin(2 * np.pi * x)
y2 = 0.8 * np.sin(4 * np.pi * x)
fig, (ax1, ax2, ax3) = plt.subplots(3, 1, sharex=True, figsize=(6, 6))
ax1.fill_between(x, y1)
ax1.set_title('fill between y1 and 0')
ax2.fill_between(x, y1, 1)
ax2.set_title('fill between y1 and 1')
ax3.fill_between(x, y1, y2)
ax3.set_title('fill between y1 and y2')
ax3.set_xlabel('x')
fig.tight_layout()
信頼区間
fill_betweenの一般的な用途は、信頼区間を示すことです。fill_betweenは、カラーサイクルの色を塗りつぶし色として使用します。したがって、alphaを使って領域を半透明にすることで色を明るくするのが良い慣例です。
N = 21
x = np.linspace(0, 10, 11)
y = [3.9, 4.4, 10.8, 10.3, 11.2, 13.1, 14.1, 9.9, 13.9, 15.1, 12.5]
## fit a linear curve and estimate its y-values and their error.
a, b = np.polyfit(x, y, deg=1)
y_est = a * x + b
y_err = x.std() * np.sqrt(1/len(x) +
(x - x.mean())**2 / np.sum((x - x.mean())**2))
fig, ax = plt.subplots()
ax.plot(x, y_est, '-')
ax.fill_between(x, y_est - y_err, y_est + y_err, alpha=0.2)
ax.plot(x, y, 'o', color='tab:brown')
水平領域の選択的な塗りつぶし
パラメータのwhereを使用すると、塗りつぶす x 範囲を指定できます。これは、xと同じサイズのブール配列です。連続したTrueシーケンスの x 範囲のみが塗りつぶされます。したがって、隣接するTrueとFalseの値の間の範囲は決して塗りつぶされません。したがって、データポイントの x 距離が十分に小さく、上記の効果が目立たない場合を除き、interpolate=Trueを設定することをお勧めします。
x = np.array([0, 1, 2, 3])
y1 = np.array([0.8, 0.8, 0.2, 0.2])
y2 = np.array([0, 0, 1, 1])
fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True)
ax1.set_title('interpolation=False')
ax1.plot(x, y1, 'o--')
ax1.plot(x, y2, 'o--')
ax1.fill_between(x, y1, y2, where=(y1 > y2), color='C0', alpha=0.3)
ax1.fill_between(x, y1, y2, where=(y1 < y2), color='C1', alpha=0.3)
ax2.set_title('interpolation=True')
ax2.plot(x, y1, 'o--')
ax2.plot(x, y2, 'o--')
ax2.fill_between(x, y1, y2, where=(y1 > y2), color='C0', alpha=0.3,
interpolate=True)
ax2.fill_between(x, y1, y2, where=(y1 <= y2), color='C1', alpha=0.3,
interpolate=True)
fig.tight_layout()
軸全体にわたる水平領域の選択的なマーキング
同じ選択メカニズムを使用して、軸の垂直方向の全体の高さを塗りつぶすことができます。y 制限に依存しないように、データ座標で x 値を解釈し、軸座標で y 値を解釈する変換を追加します。次の例では、y データが指定されたしきい値を超えている領域をマークしています。
fig, ax = plt.subplots()
x = np.arange(0, 4 * np.pi, 0.01)
y = np.sin(x)
ax.plot(x, y, color='black')
threshold = 0.75
ax.axhline(threshold, color='green', lw=2, alpha=0.7)
ax.fill_between(x, 0, 1, where=y > threshold,
color='green', alpha=0.5, transform=ax.get_xaxis_transform())
まとめ
この実験では、Matplotlib のfill_between関数を使って 2 つの線の間の領域を塗りつぶす方法を学びました。また、水平領域を選択的に塗りつぶし、軸全体にわたる水平領域をマークする方法も学びました。