matplotlibの凡例を軸の外側に移動すると、図のボックスで切り取られてしまいます。質問する

matplotlibの凡例を軸の外側に移動すると、図のボックスで切り取られてしまいます。質問する

私は以下の質問についてよく知っています:

プロットの外側に凡例がある 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

ベストアンサー1

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 アルゴリズム内でどのように考慮されるかを示しました。

[編集] 以下のコメントの中には、2019 年以降、コマンドが簡素化されたと書かれているものがあります。plt.savefig ('x.png', bbox_inches='tight') で十分でした。共有していただきありがとうございます。 – mateuszb 2019 年 6 月 27 日

おすすめ記事