matplotlibで一定区間に背景色をつける方法

graph_with_background_color

matplotlibでグラフを作成するにあたり、背景の一定区間に背景色をつける方法の紹介です。

先に書いてしまうと、axes.axvspanとaxes.axhspanを使います。

参考: https://stackoverflow.com/questions/23248435/fill-between-two-vertical-lines-in-matplotlib

x軸方向の一定範囲に色をつけたい場合

グラフのx軸方向の一定範囲に色をつけたい場合はaxvspanを使用します。
時刻データの場合として、コード例を示します。

fig, ax = plt.subplots(figsize=(8, 4))
start_datetime = datetime.datetime(2019, 3,4)
end_datetime = datetime.datetime(2019, 3,5)
ax.plot(sample_df["datetime"], sample_df["data"])
ax.axvspan(start_datetime, end_datetime, color="gray", alpha=0.3)
ax.grid()
labels = ax.get_xticklabels()
plt.setp(labels, rotation=15, fontsize=12);
ax.set_title("Fill between 2019-03-04 and 2019-03-05")

描画結果はこちらです。
graph_with_background_color

axvspan自体の引数はxmin, xmax, ymin(default:0), ymax(default:1)です。

y軸関連の引数は0が下端、1が上端を示すため、デフォルト値でグラフの上下方向への対応ができ、非常に便利です。

y軸方向の一定範囲に色をつけたい場合

グラフのy軸方向の一定範囲に色をつけたい場合はaxhspanを使用します。
コード例を示します。

fig, ax = plt.subplots(figsize=(8, 4))
ax.plot(sample_df["datetime"], sample_df["data"])
ax.axhspan(25, 75, color="gray", alpha=0.3)
ax.grid()
labels = ax.get_xticklabels()
plt.setp(labels, rotation=15, fontsize=12);
ax.set_title("Fill between 25 and 75")

描画結果はこちらです。
axhspanの例

axhspan自体の引数はymin, ymax, xmin(default:0), xmax(default:1)です。
axvspan同様、デフォルト値でグラフの左右方向への対応ができ、非常に便利です。

関連情報: axvlineとaxhline

今回axvspan, axhspanに関連し、色ではなく線を引くaxvlineaxhlineもご紹介します。
この二つも描画範囲に合わせて垂直方向、水平方向にちょうど良い線を引いてくれる非常に便利な関数です。

諸々盛り込んだコード例を示します。

fig, ax = plt.subplots(figsize=(8, 4))
start_datetime = datetime.datetime(2019, 3,4)
end_datetime = datetime.datetime(2019, 3,5)
ax.plot(sample_df["datetime"], sample_df["data"])
ax.axvspan(start_datetime, end_datetime, color="gray", alpha=0.3)
ax.axhspan(25, 75, color="gray", alpha=0.3)
ax.axvline(datetime.datetime(2019,3,1), color="black")
ax.axhline(0, color="black")
ax.grid()
labels = ax.get_xticklabels()
plt.setp(labels, rotation=15, fontsize=12);
ax.set_title("axvspan, axhspan, axvline and axhline")

描画結果はこちらです。
axvspanやaxvlineなどの使用例

これらの関数をオプションもうまく活用しながら利用することで、かなり楽に目的のグラフが作成できそうです。

まとめ

区間に対して背景色をつける際に使用するaxspan, axvspanと、関連してaxvline、axhlineをご紹介しました。
関知しない方向については勝手に対応してくれるこれらの関数は描画の際にとても便利です。
使い方も簡単なので、役立てていきましょう。

参考資料

https://stackoverflow.com/questions/23248435/fill-between-two-vertical-lines-in-matplotlib
https://matplotlib.org/api/_as_gen/matplotlib.axes.Axes.axvspan.html
https://matplotlib.org/3.1.0/api/_as_gen/matplotlib.axes.Axes.axhspan.html
https://matplotlib.org/3.1.0/api/_as_gen/matplotlib.axes.Axes.axvline.html
https://matplotlib.org/3.1.0/api/_as_gen/matplotlib.axes.Axes.axhline.html