今回は Matplotlib で2本の線グラフの間を塗りつぶす方法をご紹介します。
Matplotlib については、次の記事も参考にしてください。
2本の線グラフを描く
まずは2本の線グラフを描きます。
import matplotlib.pyplot as plt
import numpy as np
# データを定義
x = [i/10 for i in range(-20, 21)]
y1 = np.array([2] * 41)
y2 = np.array([i**2 for i in x])
# Figureインスタンスを作成
fig = plt.figure(
figsize = (6, 4),
dpi = 120,
linewidth = 5,
tight_layout = True,
facecolor = 'orange',
)
# FigureインスタンスにAxesオブジェクトを追加
# グラフのタイトル、ラベル、背景色を設定
ax = fig.add_subplot(
title = 'fill_between',
xlabel = 'x',
ylabel = 'y',
facecolor = 'black',
)
# Axesオブジェクトにグラフの種類とデータを設定
# colorは線の色、linewidthは線の太さ
ax.plot(x, y1, color='red', linewidth=2, label='y1')
ax.plot(x, y2, color='blue', linewidth=2, label='y2')
# Axesオブジェクトに凡例を追加
ax.legend(
bbox_to_anchor=(1, 1),
loc='upper left',
borderaxespad=0.3,
facecolor='white',
fontsize=10
)
# 補助線を表示、透明度alphaを0.5に設定
ax.grid(True, alpha=0.5)
# グラフを表示
plt.show()
y 軸のデータは Numpy の ndarray の形式にしています。
後ほど説明しますが、リスト形式でもグラフは描けますが、y 軸のデータは ndarray 形式にしてください。
2本の線グラフの間を塗りつぶす
続いて、描いた2本の線グラフの間を塗りつぶします。
Axes オブジェクト(ax
)が持つfill_between()
メソッドを使用します。
追加したコード
# 塗りつぶしの設定
# y1とy2の間をgreen色に塗りつぶす
ax.fill_between(x, y1, y2, facecolor='green')
全体
import matplotlib.pyplot as plt
import numpy as np
x = [i/10 for i in range(-20, 21)]
y1 = np.array([2] * 41)
y2 = np.array([i**2 for i in x])
fig = plt.figure(
figsize = (6, 4),
dpi = 120,
linewidth = 5,
tight_layout = True,
facecolor = 'orange',
)
ax = fig.add_subplot(
title = 'fill_between',
xlabel = 'x',
ylabel = 'y',
facecolor = 'black',
)
ax.plot(x, y1, color='red', linewidth=2, label='y1')
ax.plot(x, y2, color='blue', linewidth=2, label='y2')
ax.legend(
bbox_to_anchor=(1, 1),
loc='upper left',
borderaxespad=0.3,
facecolor='white',
fontsize=10
)
ax.grid(True, alpha=0.5)
# 塗りつぶしの設定
# y1とy2の間をgreen色に塗りつぶす
ax.fill_between(x, y1, y2, facecolor='green')
plt.show()
条件を指定して塗りつぶす
最後に、条件を指定して塗りつぶします。
「y1 よりも y2 の方が値が小さい」範囲を塗りつぶします。
fill_between()
メソッドに where
オプションを指定します。
変更箇所
# whereオプションで条件を指定
ax.fill_between(x, y1, y2, where=y2 < y1, facecolor='green')
全体
import matplotlib.pyplot as plt
import numpy as np
x = [i/10 for i in range(-20, 21)]
y1 = np.array([2] * 41)
y2 = np.array([i**2 for i in x])
fig = plt.figure(
figsize = (6, 4),
dpi = 120,
linewidth = 5,
tight_layout = True,
facecolor = 'orange',
)
ax = fig.add_subplot(
title = 'fill_between',
xlabel = 'x',
ylabel = 'y',
facecolor = 'black',
)
ax.plot(x, y1, color='red', linewidth=2, label='y1')
ax.plot(x, y2, color='blue', linewidth=2, label='y2')
ax.legend(
bbox_to_anchor=(1, 1),
loc='upper left',
borderaxespad=0.3,
facecolor='white',
fontsize=10
)
ax.grid(True, alpha=0.5)
# whereオプションで条件を指定
ax.fill_between(x, y1, y2, where=y2 < y1, facecolor='green')
plt.show()
このwhere
オプションを指定する際、y 軸のデータがリスト形式になっていると、次のメッセージが表示され、うまく塗りつぶせません。
MatplotlibDeprecationWarning: The parameter where must have the same size as x in fill_between(). This will become an error in future versions of Matplotlib.
これは、リスト形式同士を比較した時と、ndarray同士を比較した時の返り値を確認すると、何が違うかが分かります。
リスト形式の場合
z1 = [2] * 31
z2 = [i**2 for i in x]
print(z1 > z2)
False
ndarray の場合
z1 = np.array([2] * 31)
z2 = np.array([i**2 for i in x])
print(z1 > z2)
array([False, True, True, True, True, True, True, True, True,
True, True, True, True, True, True, True, True, True,
True, True, True, True, True, True, True, True, True,
True, True, True, False])
Google Colaboratory
本記事に掲載しているコードは Google Colaboratory で動作を確認しています。
下記からアクセスして、ご自身の Google ドライブにコピーしていただければ、すぐに実行できます。
本記事を書いた時点の Python および ライブラリーのバージョンは下記になっていました。
- Python 3.7.13
- Numpy 1.21.5
- Matplotlib 3.2.2
環境構築の不要な Google が提供している Web サービスなので、Python を学習中の方にはオススメです。
おわりに
今回は、
Matplotlib で2本の線グラフの間を塗りつぶす方法
をご紹介しました。
fill_between()
メソッド1つで塗りつぶせるので簡単ですね。
以上です。
コメント