web-dev-qa-db-ja.com

matplotlibでの凡例ボックスの移動とサイズ変更

SVGとして保存するMatplotlibを使用してプロットを作成し、Inkscapeを使用して.pdf + .pdf_texにエクスポートし、.pdf_texファイルをLaTeXドキュメントに含めます。

これは、タイトル、凡例などにLaTeXコマンドを入力して、次のような画像を提供できることを意味します plot

laTeXドキュメントで使用すると、このように表示されます。軸の数値のフォントが変更され、凡例のLaTeXコードがコンパイルされることに注意してください。

plot rendered using LaTeX

プロットのコード(SVGにエクスポートする方法はここには表示されていませんが、要求に応じて表示できます):

_import numpy as np
x = np.linspace(0,1,100)
y = x**2

import matplotlib.pyplot as plt
plt.plot(x, y, label = '{\\footnotesize \$y = x^2\$}')
plt.legend(loc = 'best')
plt.show()
_

問題は、ご覧のとおり、凡例の周りのボックスの配置とサイズが間違っていることです。これは、画像がInkscape + pdflatexを通過するとラベルのテキストのサイズが変わるためです(_\footnotesize_などが消え、フォントサイズが変わるため)。

どちらかでラベルの配置を選択できることがわかりました

_plt.label(loc = 'upper right')
_

または、もっと細かく制御したい場合は、

_plt.label(bbox_to_anchor = [0.5, 0.2])
_

しかし、ラベルの周りのボックスを小さくする方法はまだ見つけていません。これは可能ですか?

ボックスを小さくする別の方法は、次のようなものを使用してボックスの輪郭を削除することです

_legend = plt.legend()
legend.get_frame().set_edgecolor('1.0')
_

ラベルを好きな場所に移動します。その場合、最初にpython/matplotlibを使用してラベルを配置させることで、ラベルの配置を設定できるようにしたいと思います

_plt.label(loc = 'upper right')
_

次に、たとえば少し右に移動します。これは可能ですか? get_bbox_to_anchor()set_bbox_to_anchor()を使用してみましたが、機能しないようです。

13
Filip S.

凡例は、描画して自動的に配置した後、bboxの位置を取得して移動できます。次に例を示します。

import matplotlib.pyplot as plt
import numpy as np

# Plot data
x = np.linspace(0,1,100)
y = x**2
fig = plt.figure()
ax = fig.add_subplot(221) #small subplot to show how the legend has moved. 

# Create legend
plt.plot(x, y, label = '{\\footnotesize \$y = x^2\$}')
leg = plt.legend( loc = 'upper right')

plt.draw() # Draw the figure so you can find the positon of the legend. 

# Get the bounding box of the original legend
bb = leg.get_bbox_to_anchor().inverse_transformed(ax.transAxes)

# Change to location of the legend. 
xOffset = 1.5
bb.x0 += xOffset
bb.x1 += xOffset
leg.set_bbox_to_anchor(bb, transform = ax.transAxes)


# Update the plot
plt.show()

legend moved after first drawing

18
Molly

bbox_to_anchorおよびbbox_transformパラメータを使用して、凡例のアンカーを設定できます。

ax = plt.gca()
plt.legend(bbox_to_anchor=(1.1, 1.1), bbox_transform=ax.transAxes)

この例では、(1.1, 1.1)が座標軸にあることに注意してください。データ座標を使用する場合は、代わりにbbox_transform=ax.transDataを使用する必要があります。

10