はじめに

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
AB
row_02101
row_14105
row_23104
row_36106
row_41102
row_5 5103

ax1:A(棒グラフ) ax2:B(折れ線グラフ)

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

最前面最背面
折れ線grid棒グラフ
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()

ax1:B(折れ線グラフ) ax2:A(棒グラフ)

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

最前面最背面
棒グラフ折れ線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をなくすと棒グラフがなくなり、0に近い値を入れるほど透過率が上がります。

最前面最背面
折れ線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)
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軸グラフの作成は以上です。
ご閲覧いただきありがとうございました。

(著:中山 翔太

関連記事