凡例を配置する(bbox_to_anchor
)
凡例は、へのloc
引数を使用して、軸の境界ボックスの内側に配置されplt.legend
ます。
たとえばloc="upper right"
、凡例は境界ボックスの右上隅に配置されます。これは、デフォルトで(0,0)
は(1,1)
、軸座標(または境界ボックス表記(x0,y0, width, height)=(0,0,1,1)
)からまでの範囲です。
凡例を軸の境界ボックスの外側に配置するに(x0,y0)
は、凡例の左下隅の軸座標のタプルを指定できます。
plt.legend(loc=(1.04,0))
ただし、より用途の広いアプローチは、bbox_to_anchor
引数を使用して、凡例を配置するバウンディングボックスを手動で指定することです。(x0,y0)
bboxの一部のみを供給するように制限することができます。これにより、ゼロスパンボックスが作成され、そこから凡例はloc
引数で指定された方向に拡張されます。例えば
plt.legend(bbox_to_anchor =(1.04,1)、loc = "上左")
凡例を軸の外側に配置し、凡例の左上隅を(1.04,1)
座標軸の座標に配置します。
さらなる例を以下に示します。さらに、mode
およびのような異なる引数間の相互作用ncols
が示されています。
l1 = plt.legend(bbox_to_anchor=(1.04,1), borderaxespad=0)
l2 = plt.legend(bbox_to_anchor=(1.04,0), loc="lower left", borderaxespad=0)
l3 = plt.legend(bbox_to_anchor=(1.04,0.5), loc="center left", borderaxespad=0)
l4 = plt.legend(bbox_to_anchor=(0,1.02,1,0.2), loc="lower left",
mode="expand", borderaxespad=0, ncol=3)
l5 = plt.legend(bbox_to_anchor=(1,0), loc="lower right",
bbox_transform=fig.transFigure, ncol=3)
l6 = plt.legend(bbox_to_anchor=(0.4,0.8), loc="upper right")
4タプル引数を解釈する方法についての詳細はするbbox_to_anchor
、のようにl4
、で見つけることができ、この質問。mode="expand"
4タプルによって与えられたバウンディングボックス内に水平凡例を拡大します。縦に拡大された凡例については、この質問を参照してください。
Axes座標ではなくFigure座標で境界ボックスを指定すると便利な場合があります。これはl5
上記の例に示されています。ここでは、bbox_transform
引数を使用して、図の左下隅に凡例を配置しています。
後処理
凡例を軸の外側に配置すると、完全にまたは部分的に図のキャンバスの外側にあるという望ましくない状況が発生することがよくあります。
この問題の解決策は次のとおりです。
サブプロットパラメーター
を調整するを使用して、AxesがFigure内のスペースを少なくする(したがって、凡例に多くのスペースを残す)ように、サブプロットパラメーターを調整できますplt.subplots_adjust
。例えば
plt.subplots_adjust(right=0.7)
図の右側に30%のスペースを残します。ここに凡例を配置できます。
タイトレイアウト
使用plt.tight_layout
図形の要素が図形の端にぴったりと合うようにサブプロットパラメーターを自動的に調整できます。残念ながら、この自動化では凡例は考慮されていませんが、サブプロット領域全体(ラベルを含む)が収まる長方形のボックスを提供できます。
plt.tight_layout(rect=[0,0,0.75,1])
数字を保存するbbox_inches = "tight"
引数bbox_inches = "tight"
するplt.savefig
(伝説含む)キャンバス上のすべてのアーティストが保存された領域にフィットしているような姿を保存するために使用することができます。必要に応じて、図のサイズが自動的に調整されます。
plt.savefig("output.png", bbox_inches="tight")
- サブプロットのパラメーター
を自動的に調整する図のサイズを変更せずに凡例がキャンバス内に収まるようにサブプロットの位置を自動的に調整する方法は、この答えにあります:正確なサイズでパディングなしの軸の作成(および軸の外側の凡例)
上記のケースの比較:
代替案
図の凡例
軸の代わりに図の凡例を使用できますmatplotlib.figure.Figure.legend
。これは、特別な引数を必要としないmatplotlibバージョン> = 2.1で特に役立ちます。
fig.legend(loc=7)
フィギュアのさまざまな軸ですべてのアーティストの伝説を作成します。凡例はloc
、Axes内に配置される方法と同様に、引数を使用して配置されますが、Figure全体を参照します。したがって、凡例は自動的にAxesの外側になります。残りは、凡例とAxesが重ならないようにサブプロットを調整することです。ここで、 上記の「サブプロットパラメータの調整」のポイントが役立ちます。例:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0,2*np.pi)
colors=["#7aa0c4","#ca82e1" ,"#8bcd50","#e18882"]
fig, axes = plt.subplots(ncols=2)
for i in range(4):
axes[i//2].plot(x,np.sin(x+i), color=colors[i],label="y=sin(x+{})".format(i))
fig.legend(loc=7)
fig.tight_layout()
fig.subplots_adjust(right=0.75)
plt.show()
専用サブプロット軸内の凡例
を使用bbox_to_anchor
する代わりに、凡例を専用サブプロット軸(lax
)に配置することもできます。凡例サブプロットはプロットよりも小さくなければならないためgridspec_kw={"width_ratios":[4,1]}
、軸の作成時に使用できます。軸を非表示にしてlax.axis("off")
、凡例を挿入することができます。凡例のハンドルとラベルはh,l = ax.get_legend_handles_labels()
、を介して実際のプロットから取得する必要があり、lax
サブプロットの凡例に提供できlax.legend(h,l)
ます。完全な例を以下に示します。
import matplotlib.pyplot as plt
plt.rcParams["figure.figsize"] = 6,2
fig, (ax,lax) = plt.subplots(ncols=2, gridspec_kw={"width_ratios":[4,1]})
ax.plot(x,y, label="y=sin(x)")
....
h,l = ax.get_legend_handles_labels()
lax.legend(h,l, borderaxespad=0)
lax.axis("off")
plt.tight_layout()
plt.show()
これにより、上記のプロットと視覚的に非常によく似たプロットが生成されます。
最初の軸を使用して凡例を配置することもできますbbox_transform
が、凡例の軸を使用します。
ax.legend(bbox_to_anchor=(0,0,1,1), bbox_transform=lax.transAxes)
lax.axis("off")
このアプローチでは、凡例ハンドルを外部から取得する必要はありませんが、bbox_to_anchor
引数を指定する必要があります。
さらに読むとメモ:
- 凡例で実行したいその他の例のいくつかを含むmatplotlib 凡例ガイドを検討してください。
- 円グラフの凡例を配置するためのいくつかのサンプルコードは、この質問への回答で直接見つけることができます。 Python-凡例が円グラフと重複しています
loc
引数は数字の代わりに通話を短くする文字列を、取ることができ、しかし、彼らは非常に直感的に相互にマップされていません。参照用のマッピングは次のとおりです。