Matplotlibで2軸グラフの作る方法

今回は、Matplotlibで2軸グラフを作る方法について。

値の水準が違うグラフを重ねて表示すると、とても見にくいグラフになってしまう。

例えば下のようなグラフ。
見にくいグラフ
このグラフは、値が10前後の棒グラフと値が100前後の折れ線グラフが1つのグラフに表示されている。

そのせいで、それぞれのグラフがつぶれてしまい動きが分かりにくくなってしまっている。

さらに、棒グラフと折れ線グラフが上下に離れて表示されているせいで、グラフ自体も不格好となり、棒グラフと折れ線の関係も分かりにくくなっている。

2軸グラフを使うとことで、こういう見にくいグラフを改善することができる。

2軸グラフというのは、縦軸を左側だけに表示するのではなく、右側にも表示することで、棒グラフの値は左軸、折れ線の値は右軸といった表示が可能になり、見やすいグラフを作ることができる。


Matplotlibで2軸グラフを作る

Matplotlibで左軸と右軸をどちらも使うには、twinx()メソッドをつかう。

ここからは、順をおって実際に2軸グラフを作ってみることにする。2軸グラフを作成することに焦点を当てるため、グラフの書式などは変更せずシンプルなものにする。

2軸グラフの作成手順

インポート

まずはMatplotlibのインポートを行う。

import matplotlib.pyplot as plt


figureとsubplotの作成

次にfigureとsubplotを作成する。
1つ目のグラフは1行1列の1つ目のグラフとして指定する。2つ目のグラフは、1つ目のグラフと同じx軸で違うy軸を使うので、twinx()メソッドをつかう。

※y軸を共有して、x軸を2軸にする時はtwiny()メソッドをつかう。


# figureの作成
fig = plt.figure()

# subplotの作成
ax1 = fig.add_subplot(1, 1, 1)
ax2 = ax1.twinx()


x軸とy軸の値

x軸は、A、B、C、D、Eというアルファベットを指定する。
y軸は、1つ目のグラフが10前後の値、2つ目のグラフが100前後の値にする。

x_label = ["A", "B", "C", "D", "E"]
y1 = [10, 12, 11, 9, 13]
y2 = [101, 103, 100, 102, 105]


グラフの指定

1つ目のグラフは棒グラフ、2つ目のグラフは折れ線グラフにする。


ax1.bar(x_label, y1, label="グラフ1")
ax2.plot(x_label, y2, color='r', label="グラフ2")


タイトル、ラベル、凡例

タイトル、ラベル、凡例を表示する。
どちらのグラフが左右どちらの軸を使うのかが分かりにくいため、ちゃんとラベルや凡例を表示した方が良い。
最後に、plt.show()でグラフを表示する。


# グラフタイトルとラベル
ax1.set_title("2軸グラフ")
ax1.set_ylabel("グラフ1")
ax2.set_ylabel("グラフ2")

# 凡例
ax1.legend()
ax2.legend(loc='upper center')

plt.show()

完成形

これまでの手順を実行することで、下のように2軸を持ったグラフを作ることができる。
書式などは変更していないので不格好さは残っているものの、はじめに掲載したグラフのような見にくさは改善されているのではないか。

全コード

最後に今回の全コードを記載しておく

import matplotlib.pyplot as plt

# figureの作成
fig = plt.figure()

# subplotの作成
ax1 = fig.add_subplot(1, 1, 1)
ax2 = ax1.twinx()

x_label = ["A", "B", "C", "D", "E"]
y1 = [10, 12, 11, 9, 13]
y2 = [101, 103, 100, 102, 105]

ax1.bar(x_label, y1, label="グラフ1")
ax2.plot(x_label, y2, color='r', label="グラフ2")

# グラフタイトルとラベル
ax1.set_title("2軸グラフ")
ax1.set_ylabel("グラフ1")
ax2.set_ylabel("グラフ2")

# 凡例
ax1.legend()
ax2.legend(loc='upper center')

plt.show()


以上、今回はここまで。



最後まで読んでくれてありがとうございます。

0 件のコメント :