【matplotlib】2つのy軸を持つグラフと凡例の調整

2つのy軸を持つグラフを作成するサンプルコードを紹介します。

2つのy軸をもつグラフの書き方

まずは単純に2つのy軸を持つグラフを描いてみます。

以下のようなグラフを生成するサンプルコードを紹介します。

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(10)
# =>  array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
y = x**2
# => array([ 0,  1,  4,  9, 16, 25, 36, 49, 64, 81])
y2 = np.sqrt(x)
# => array([0.        , 1.        , 1.41421356, 1.73205081, 2.        ,2.23606798, 2.44948974, 2.64575131, 2.82842712, 3.        ])

fig, ax1 = plt.subplots()
ax1.plot(x, y, label="y")
ax2 = ax1.twinx()  # これが重要
ax2.plot(x, y2, label="y2")
plt.show()

ax1.twinx()によってx軸を共有することができます。
これによってax1とax2をくっつけることができます。

凡例の調整

ただ上の通りコードでただ凡例を表示すると、以下のように正しく表示されません。

それを以下のコードで解決することができます。

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(10)
# =>  array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
y = x**2
# => array([ 0,  1,  4,  9, 16, 25, 36, 49, 64, 81])
y2 = np.sqrt(x)
# => array([0.        , 1.        , 1.41421356, 1.73205081, 2.        ,2.23606798, 2.44948974, 2.64575131, 2.82842712, 3.        ])

fig, ax1 = plt.subplots()
ax1.plot(x, y, label="y")
ax2 = ax1.twinx()
ax2.plot(x, y2, label="y2")

# 以下追加部分
# -----------------------------------------
lines_1, labels_1 = ax1.get_legend_handles_labels()
lines_2, labels_2 = ax2.get_legend_handles_labels()

lines = lines_1 + lines_2
labels = labels_1 + labels_2

ax1.legend(lines, labels)
# -----------------------------------------

plt.show()

次のようにプロットされます。

ラベル等を1つにまとめて表示しています。

参考文献

PythonユーザのためのJupyter[実践]入門

タイトルとURLをコピーしました