Matplotlibで凡例と第2Y軸を使って同じプロットに2つのPandas時系列を描画する方法
MatplotlibとPandasを組み合わせることで、異なるスケールを持つ2つの時系列データを1つのグラフ上に簡単に重ねて描画できます。この記事では、凡例と第2Y軸(secondary Y-axis)を使用して、2つのPandas時系列を同じプロットに表示する手順を解説します。
実装の手順
figure.figsizeで図のサイズを設定し、figure.autolayoutでサブプロット周辺の余白を自動調整します。日付インデックス(時系列)を持つ1次元のndarrayを作成します。
複数の列を持つDataFrameを作成します。
DataFrameのplot()メソッドを使って、列Aと列Bを描画します。このとき、2番目の系列には
secondary_y=Trueを指定して第2Y軸に割り当てます。get_legend_handles_labels()メソッドを使って、各軸の凡例用ハンドルとラベルを取得します。
legend()メソッドで、両方の系列の情報をまとめた凡例を図に配置します。
show()メソッドで図を表示します。
コード例
import pandas as pd
from matplotlib import pyplot as plt
import numpy as np
plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True
ts = pd.Series(np.random.randn(10), index=pd.date_range('2021-04-10', periods=10))
df = pd.DataFrame(np.random.randn(10, 4), index=ts.index, columns=list('ABCD'))
ax1 = df.A.plot(color='red', label='Count')
ax2 = df.B.plot(color='yellow', secondary_y=True, label='Sum')
h1, l1 = ax1.get_legend_handles_labels()
h2, l2 = ax2.get_legend_handles_labels()
plt.legend(h1+h2, l1+l2, loc=2)
plt.show()
ポイント解説
このコードの重要なポイントは以下の通りです。
secondary_y=Trueを指定することで、列Bは右側の第2Y軸に対して描画されます。これにより、単位やスケールが異なる2つの系列を1つのグラフで比較できます。それぞれの軸(
ax1とax2)から取得した凡例ハンドルとラベルをh1+h2、l1+l2のように連結することで、両方の系列を含む統合的な凡例を作成できます。loc=2は凡例を左上に配置することを意味します。必要に応じて'best'などの値に変更可能です。
出力結果
上記のコードを実行すると、赤色の線(Count:左Y軸基準)と黄色の線(Sum:右Y軸基準)が同じプロット内に描画され、左上には両系列の凡例が表示されます。
-
Matplotlibの折れ線グラフでY軸に複数のPandas列をプロットする方法
折れ線グラフのY軸に複数のPandas列をプロットしたい場合、set_index()メソッドを使ってインデックスを設定するのが簡単な方法です。この記事では、その具体的な手順とコード例を紹介します。実行手順図のサイズを設定し、サブプロット間および周囲の余白(パディング)を調整します。「Category 1」「Category 2」「Category 3」の3つの列を持つデータフレームを作成します。set_index()メソッドを使用して、既存の列からDataFrameのインデックスを設定します。図を表示するには、show()メソッドを呼び出します。コード例import pandas as pd
-
MatplotlibでNaN値を含むデータをプロット・操作する方法を解説
MatplotlibでNaN値をプロット・操作する手順 Matplotlibでは、NaN(欠損値)を含むデータもそのまま可視化できます。基本的な流れは以下の3ステップです。 NumPyを使って、NaN値をいくつか含むデータ(配列)を作成します。 imshow()メソッドを使用し、カラーマップとステップ1で作成したデータを指定して、2次元の正規ラスタ上に画像として表示します。デフォルトでは、NaNの部分は自動的に空白(マスクされた領域)として描画されます。 作成した図を画面に表示するには、show()メソッドを呼び出します。 コード例 import numpy as np from matp