5

matplotlib の凡例に四角形をプロットしようとしています。

私がどこまで到達したかを説明するために、最善の試みを示しましたが、うまくいきませんでした:

import matplotlib.pyplot as plt  
from matplotlib.patches import Rectangle
import numpy as np

Fig = plt.figure()
ax = plt.subplot(111)

t = np.arange(0.01, 10.0, 0.01)
s1 = np.exp(t)
ax.plot(t, s1, 'b-', label = 'dots')

leg = ax.legend()

rectangle = Rectangle((leg.get_frame().get_x(),
                  leg.get_frame().get_y()),
                  leg.get_frame().get_width(),
                  leg.get_frame().get_height(), 
                  fc = 'red'
                 )

ax.add_patch(rectangle)

plt.show()

四角形は、図のどこにも描画されていません。leg.get_frame().get_x()、leg.get_frame().get_y())、leg.get_frame().get_width()、leg.get_frame().get_height() の値を見ると、それぞれ 0.0、0.0、1.0、1.0 であること。

したがって、私の問題は、伝説のフレームの座標を見つけることです。

あなたが私を助けてくれるなら、それは本当に素晴らしいことです.

ここまで読んでくれてありがとう。

4

2 に答える 2

2

問題は、凡例の位置が事前にわからないことです。フィギュアをレンダリングする(を呼び出すplot())までに、位置が決定されます。

私が出くわした解決策は、図を2回描くことです。さらに、軸座標(デフォルトはデータ座標)を使用して長方形をスケーリングしたので、その背後にある凡例が少し表示されます。凡例と長方形zorderも設定する必要があることに注意してください。凡例は長方形よりも遅く描画されるため、それ以外の場合、長方形は凡例の後ろに表示されなくなります。

import numpy as np
import matplotlib.pyplot as plt  
from matplotlib.patches import Rectangle

Fig = plt.figure()
ax = plt.subplot(111)

t = np.arange(0.01, 10.0, 0.01)
s1 = np.exp(t)
ax.plot(t, s1, 'b-', label = 'dots')

leg = ax.legend()
leg.set_zorder(1)
plt.draw()  # legend position is now known
bbox = leg.legendPatch.get_bbox().inverse_transformed(ax.transAxes)
rectangle = Rectangle((bbox.x0, bbox.y0), 
                      bbox.width*0.8, bbox.height*0.8, 
                      fc='red', transform=ax.transAxes, zorder=2)
ax.add_patch(rectangle)
plt.show()
于 2012-10-03T09:43:17.480 に答える