morikomorou’s blog

自分が学んだことなどの備忘録的なやつ

【python】matplotlibの凡例の位置を手動で微調整するスマートな方法

凡例を手動で調整したいという話

皆さんはmatplotlibを使ってグラフを書いた際に、凡例の位置の調整でイライラしたことありませんか?

plt.legend(loc='best')

とかやると自動で最適な位置を見つけて凡例を配置してくれますが、あともう少し右!とか、もう少し下!とか微調整したいなとか思うことがあるんじゃないでしょうか?


なんかいろいろbboxやらなんやらパラメータに渡せば思い通りの調整ができるかもしれません。
しかし高々、”微”調整のために各種パラメータの使い方調べたり、試したりするのってわりと面倒で、結局そのままグラフを保存してしまっていることありますよね。
excelで書くグラフみたいに簡単に手動で動かせればいいなと思いました。

これまでの記事でグラフとマウスのイベントの紐づけを勉強してきましたので、凡例に関しても、もしかしたら手動操作できるのではと思った次第です。
【python】matplotlibのグラフ上の点をドラッグで動かす - morikomorou’s blog


…とおもって公式ドキュメントのLegendの項目を読んでみると、なんと.set_draggable()なるメソッドが用意されていました。
matplotlib.legend — Matplotlib 3.8.2 documentation

もう1行で解決みたいです。
せっかくこれまで学んできたイベント処理が使えると思ったんですが、、
まぁ簡単に実装できるのは良いことですので、さっそくコードサンプル書いていきます。

凡例を手動で調整するサンプルコード

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots()
ax.plot(np.random.rand(10) * 3, label='data 1')
ax.plot(np.random.rand(10) * 2.5, label='data 2')
ax.plot(np.random.rand(10) * 1, label='data 3')
leg = plt.legend()
leg.set_draggable(True)           # legendをドラッグ可能にする
plt.show()

コードの実行結果は以下のようになります。

おわりに

1行で実装できるので、取り合えずつけておけば心の平静を保てるかもしれません。