X軸にPandasの日時インデックスを使用したマルチカラーラインのプロット方法
MatplotlibでX軸にPandasの日時(Datetime)インデックスを使用しながら、色が変化するマルチカラーラインを描画する方法を解説します。ポイントは、日付データを数値に変換し、LineCollectionを使ってセグメントごとに色を割り当てることです。
実装の手順
plt.rcParamsで図のサイズを設定し、サブプロット間の余白を調整します。- NumPyとPandasを使って、日付インデックスd、累積和データy、シリーズsを作成します。
plt.subplots()で図とサブプロットを生成します。mdates.date2num()で日時を数値(xval)に変換し、線分用の座標配列を構築します。- 「hot」カラーマップを指定したLineCollectionのインスタンスを作成します。
- X軸の主目盛り・補助目盛りのロケーターとフォーマッターを設定します。
autoscale_view()で表示範囲をデータに合わせて自動調整します。show()メソッドで図を表示します。
サンプルコード
import pandas as pd
from matplotlib import pyplot as plt, dates as mdates, collections as c
import numpy as np
plt.rcParams["figure.figsize"] = [7.00, 3.50]
plt.rcParams["figure.autolayout"] = True
d = pd.date_range("2021-01-01", "2021-06-01", freq="7D")
y = np.cumsum(np.random.normal(size=len(d)))
s = pd.Series(y, index=d)
fig, ax = plt.subplots()
xval = mdates.date2num(s.index.to_pydatetime())
p = np.array([xval, s.values]).T.reshape(-1, 1, 2)
s = np.concatenate([p[:-1], p[1:]], axis=1)
lc = c.LineCollection(s, cmap="hot")
lc.set_array(xval)
ax.add_collection(lc)
ax.xaxis.set_major_locator(mdates.MonthLocator())
ax.xaxis.set_minor_locator(mdates.DayLocator())
m = mdates.DateFormatter("%b")
ax.xaxis.set_major_formatter(m)
ax.autoscale_view()
plt.show()
コードの解説
このコードでは、まずpd.date_range()により2021年1月1日から6月1日までの週次(7日間隔)の日付インデックスを生成しています。その後、正規分布に従う乱数の累積和で時系列データを作成します。
マルチカラー表示の鍵となるのは以下の処理です。mdates.date2num()で日時をMatplotlib内部の数値に変換し、隣接する2点をつなぐ線分(セグメント)の配列をreshapeとconcatenateで構築します。このセグメント群をLineCollectionに渡し、set_array(xval)でX値に応じた色のグラデーションを「hot」カラーマップで適用することで、時間の経過とともに色が変化するラインが描画されます。
また、X軸にはMonthLocatorで月単位の主目盛り、DayLocatorで日単位の補助目盛りを設定し、DateFormatter("%b")で月名(Jan、Febなど)を表示しています。
出力結果
上記のコードを実行すると、時間の経過に伴って黒から赤・黄色へと変化するグラデーションラインが描画されます。X軸には月名が表示され、日時インデックスとの対応がひと目でわかります。


-
【Python・Matplotlib】散布図に線を重ねて描画(オーバープロット)する方法
PythonのMatplotlibでは、scatter()メソッドでデータポイントの散布図を作成した後、plot()メソッドを使うことで、その散布図の上に自由に線を重ねて描画(オーバープロット)できます。回帰直線や基準線を可視化したい場合などに非常に便利なテクニックです。 実装の手順 figure()メソッドを使って、サイズ(4, 3)の新しい図を作成するか、既存の図をアクティブにします。 plt.axes()で現在の図に軸を追加し、それをカレントのAxesとして取得します。 scatter()メソッドで散布図のポイントを描画します。 ax.plot()メソッドで線を描画し、散布図の上に重ね
-
Pandasの時系列プロットに垂直線を描画する方法
Pandasを使ってデータフレームを作成し、Matplotlibのaxvline()メソッドを利用することで、時系列プロット上の任意の位置に垂直線を簡単に追加できます。本記事では、その具体的な手順をサンプルコード付きで解説します。手順Pandasを使用して、日付をインデックスとしたデータフレームを作成します。データフレームを基に、Matplotlibで時系列の折れ線グラフをプロットします。axvline()メソッドを使い、指定した日付の位置に緑色の破線(linestyle=dashed)で垂直線を追加します。同様にaxvline()を使い、別の日付の位置に赤色の破線で垂直線を追加します。plt