【matplotlib】凡例を二つに分割したい【python】

一つのグラフに複数のデータを描画したとき、凡例(legend)の表示をデータごとに分けたくなった。

get_legend_landles_labels()という関数が用意されていて、handleとlabelを取得できる。ちなみにhandleとlabelというのはこれ。

hans, labs = ax1.get_legend_handles_labels()

 

このhans、labsの中にそれぞれのデータの凡例情報がリストで格納されているので、対応するデータを指定すると一部だけを凡例にすることが出来る。

ax1.legend(handles=hans[:1], labels=labs[:1],loc='upper right')#y1の凡例

 

ax1.legend(handles=hans[1:], labels=labs[1:],loc='upper left')#y2の凡例

 

最後に両方表示する時にはちょっと工夫が必要で、凡例は最後に指定したものでうわあ期されてしまうので、y1とy2の凡例をl1,l2として、最後にl1を追加し直す、という操作が必要だった。

l1 = ax1.legend(handles=hans[:1], labels=labs[:1],loc='upper right')#y1の凡例をl1に
l2 = ax1.legend(handles=hans[1:], labels=labs[1:],loc='upper left')#y2の凡例をl2に
ax1.add_artist(l1)#凡例は最後に指定したものだけが表示されるので、l1を改めて追加


これを全部まとめるとこうなりました。

import numpy as np
import matplotlib.pyplot as plt

y1 = np.array([1, 2, 3, 4])
y2 = np.array([4, 3, 2, 1])
fig = plt.figure(figsize=(3, 3), facecolor="white")

ax1 = fig.add_subplot(111)
ax1.plot(y1,y1, label="y1")
ax1.plot(y1,y2, label="y2")

hans, labs = ax1.get_legend_handles_labels()#凡例のデータを取得する。

l1 = ax1.legend(handles=hans[:1], labels=labs[:1],loc='upper right')#y1の凡例をl1に
l2 = ax1.legend(handles=hans[1:], labels=labs[1:],loc='upper left')#y2の凡例をl2に

ax1.add_artist(l1)#凡例は最後に指定したものだけが表示されるので、l1を改めて追加

plt.show()