はじめに

deepblueインターン生の中山です。
Pythonのmatplotlibで複数のグラフを重ねて、2軸グラフを作成したので、まとめておきます。
グラフは折れ線グラフと棒グラフの種類の違うものを載せました。

作成したデータ

今回グラフを作成するに辺り、以下のようなデータを作成しました。
B列の方が100ほど値を大きくしておきました。

import pandas as pd
index_list = ["row_"+str(i) for i in range(6)]
df = pd.DataFrame({"A":[2,4,3,6,1,5],
                   "B":[101,105,104,106,102,103]},
                   index=index_list)
df

左軸:A(棒グラフ) 右軸:B(折れ線グラフ)

get_legend_handles_labelsを利用することで、2軸グラフを利用します。
get_legend_handles_labelsを利用せずに、グラフを作成することも可能ですが、legend(凡例)が難しくなってしまいます。
注意点として、棒グラフと折れ線グラフの順番が重要です。
これで望んだとおりのグラフが作成できます。

 最前面:折れ線グラフ
 中間 :グリッド
 最背面:棒グラフ

import matplotlib.pyplot as plt
fig, ax1 = plt.subplots(1,1,figsize=(10,8))
ax2 = ax1.twinx()
ax1.bar(df.index,df["A"],color="lightblue",label="A")
ax2.plot(df["B"],linestyle="solid",color="k",marker="^",label="B")
ax1.set_ylim(0,10)
ax2.set_ylim(100,110)
handler1, label1 = ax1.get_legend_handles_labels()
handler2, label2 = ax2.get_legend_handles_labels()
ax1.legend(handler1+handler2,label1+label2,borderaxespad=0)
ax1.grid(True)
fig.show()

左軸:B(折れ線グラフ) 右軸:A(棒グラフ)

次に棒グラフと折れ線グラフの順番を入れ替えた場合のグラフを示します。
グラフを見ると、棒グラフが折れ線グラフやgridよりも前に出てきていることが分かります。

 最前面:棒グラフ
 中間 :折れ線グラフ
 最背面:グリッド

import matplotlib.pyplot as plt
fig, ax1 = plt.subplots(1,1,figsize=(10,8))
ax2 = ax1.twinx()
ax1.plot(df["B"],linestyle="solid",color="k",marker="^",label="B")
ax2.bar(df.index,df["A"],color="lightblue",label="A")
ax1.set_ylim(100,110)
ax2.set_ylim(0,10)
handler1, label1 = ax1.get_legend_handles_labels()
handler2, label2 = ax2.get_legend_handles_labels()
ax1.legend(handler1+handler2,label1+label2,borderaxespad=0)
ax1.grid(True)
fig.show()

グラフの前後を入れ替え

上記のグラフではあまり好ましくない順序になっております。
しかし、zorderとpatch.set_alphaなどを利用することで、グラフの順番を入れ替える事ができます。
また、alphaを消去すると棒グラフがなくなり、また数値の大きさによって透過度を変更することができます。

 最前面:折れ線グラフ
 中間 :グリッド
 最背面:棒グラフ

import matplotlib.pyplot as plt
fig, ax1 = plt.subplots(1,1,figsize=(10,8))
ax2 = ax1.twinx()
ax1.plot(df["B"],linestyle="solid",color="k",marker="^",label="B")
ax2.bar(df.index,df["A"],color="lightblue",label="A")
ax1.set_ylim(100,110)
ax2.set_ylim(0,10)
ax1.set_zorder(2)
ax2.set_zorder(1)
ax1.patch.set_alpha(0)
handler1, label1 = ax1.get_legend_handles_labels()
handler2, label2 = ax2.get_legend_handles_labels()
ax1.legend(handler1+handler2,label1+label2,borderaxespad=0)
ax1.grid(True)
fig.show()

まとめ

2軸グラフの作成は以上です。
ご閲覧いただきありがとうございました。