1. ホーム
  2. パイソン

[解決済み】matplotlibの凡例を軸の外側に移動させると、図形の枠で切り取られる

2022-04-18 09:34:49

質問

私は以下の質問に詳しいです。

Matplotlib savefig でプロットの外に凡例がある場合

凡例をプロットの外に出す方法

これらの質問の答えは、凡例が収まるように軸の正確な縮小をいじることができるという贅沢なものであるようです。

しかし、軸を縮めることは理想的な解決策ではありません。なぜなら、データを小さくすることで、実際に解釈することが難しくなるからです。

ドキュメントにある複雑な凡例の例は、この必要性を示しています。なぜなら、彼らのプロットの凡例は、実際には複数のデータポイントを完全に隠しているからです。

http://matplotlib.sourceforge.net/users/legend_guide.html#legend-of-complex-plots

図形の凡例が拡大するのに合わせて、図形のボックスのサイズを動的に拡大することができればと思います。

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(-2*np.pi, 2*np.pi, 0.1)
fig = plt.figure(1)
ax = fig.add_subplot(111)
ax.plot(x, np.sin(x), label='Sine')
ax.plot(x, np.cos(x), label='Cosine')
ax.plot(x, np.arctan(x), label='Inverse tan')
lgd = ax.legend(loc=9, bbox_to_anchor=(0.5,0))
ax.grid('on')

最終的なラベル「Inverse tan」が実際には図の枠外にあることに注目してください(そして、ひどく切断されたように見えます - 出版物の品質ではありません!)。

最後に、RやLaTeXでは当たり前の動作だと言われているのに、なぜpythonではこんなに難しいのか、ちょっと困ります...。歴史的な理由があるのでしょうか?Matlabも同様にこの件に関しては苦手なのでしょうか?

このコードの(ほんの少し)長いバージョンはpastebinにあります。 http://pastebin.com/grVjc007

解決方法は?

EMSには申し訳ないのですが、実はmatplotlibのメーリングリストから別の回答を得たところです(Benjamin Rootに感謝します)。

私が探しているコードは、savefigの呼び出しを調整することです。

fig.savefig('samplefigure', bbox_extra_artists=(lgd,), bbox_inches='tight')
#Note that the bbox_extra_artists must be an iterable

これは明らかにtight_layoutの呼び出しに似ていますが、その代わりにsavefigが計算で余分なアーティストを考慮することを許可しています。これは実際、図箱のサイズを希望通りに変更しました。

import matplotlib.pyplot as plt
import numpy as np

plt.gcf().clear()
x = np.arange(-2*np.pi, 2*np.pi, 0.1)
fig = plt.figure(1)
ax = fig.add_subplot(111)
ax.plot(x, np.sin(x), label='Sine')
ax.plot(x, np.cos(x), label='Cosine')
ax.plot(x, np.arctan(x), label='Inverse tan')
handles, labels = ax.get_legend_handles_labels()
lgd = ax.legend(handles, labels, loc='upper center', bbox_to_anchor=(0.5,-0.1))
text = ax.text(-0.2,1.05, "Aribitrary text", transform=ax.transAxes)
ax.set_title("Trigonometry")
ax.grid('on')
fig.savefig('samplefigure', bbox_extra_artists=(lgd,text), bbox_inches='tight')

これで生成されます。

[編集] この問題の意図は、これらの問題に対する従来の解決策のように、任意のテキストの任意の座標配置を使用することを完全に避けることでした。にもかかわらず、最近の数多くの編集はこれらを入れることにこだわり、しばしばコードがエラーを発生させるような方法で入れていました。現在、この問題を修正し、任意のテキストを整理して、bbox_extra_artistsアルゴリズム内でこれらのテキストも考慮されることを示しました。