[解決済み】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
解決方法は?
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アルゴリズム内でこれらのテキストも考慮されることを示しました。
関連
-
ピローによる動的キャプチャ認識のためのPythonサンプルコード
-
python string splicing.join()とsplitting.split()の説明
-
風力制御におけるKS原理を深く理解するためのpythonアルゴリズム
-
PythonによるExcelファイルの一括操作の説明
-
[解決済み】TypeErrorを取得しました。エントリを持つ子テーブルの後に親テーブルを追加しようとすると、 __init__() missing 1 required positional argument: 'on_delete'
-
[解決済み] 'int'オブジェクトに'__getitem__'属性がない。
-
[解決済み] matplotlib で x 軸または y 軸の "目盛り頻度" を変更する
-
[解決済み] MatplotlibでPyPlotに凡例を追加する最も簡単な方法
-
[解決済み】Matplotlibで図のタイトルと軸ラベルのフォントサイズを設定するには?
-
[解決済み] matplotlibの図の凡例を削除する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
PythonはWordの読み書きの変更操作を実装している
-
Python百行で韓服サークルの画像クロールを実現する
-
Pythonコードの可読性を向上させるツール「pycodestyle」の使い方を詳しく解説します
-
PythonによるExcelファイルの一括操作の説明
-
[解決済み】TypeError: unhashable type: 'numpy.ndarray'.
-
[解決済み】「RuntimeError: dictionary changed size during iteration」エラーを回避する方法とは?
-
[解決済み】TypeError: 系列を <class 'float'> に変換することができません。
-
[解決済み】SyntaxError: デフォルト以外の引数がデフォルトの引数に続く
-
[解決済み】 TypeError: += でサポートされていないオペランド型: 'int' および 'list' です。
-
[解決済み] Matplotlib で凡例をプロットの外側に配置する方法