Python問題集を解いてみよう!!

【Python】2本の線グラフの間を塗りつぶす【Matplotlib】

【Python】2本の線グラフの間を塗りつぶす【Matplotlib】
URLをコピーする
URLをコピーしました!

今回は 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つで塗りつぶせるので簡単ですね。

以上です。

スポンサーリンク

【Python】2本の線グラフの間を塗りつぶす【Matplotlib】

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
URLをコピーする
URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次
目次
閉じる