我试图在matplotlib中获取图例位置。似乎Legend.get_window_extent()应该提供此功能,但无论图例位于何处,它都会返回相同的值。这是一个例子:
from matplotlib import pyplot as plt
def get_legend_pos(loc):
plt.figure()
plt.plot([0,1],label='Plot')
legend=plt.legend(loc=loc)
plt.draw()
return legend.get_window_extent()
if __name__=='__main__':
# Returns a bbox that goes from (0,0) to (1,1)
print get_legend_pos('upper left')
# Returns the same bbox, even though legend is in a different location!
print get_legend_pos('upper right')
获取图例位置的正确方法是什么?
答案 0 :(得分:2)
TL DR; 试试这个:
def get_legend_pos(loc):
plt.figure()
plt.plot([0,1],label='Plot')
legend=plt.legend(loc=loc)
plt.draw()
plt.pause(0.0001)
return legend.get_window_extent()
这就是为什么
所以我在Jupyter中尝试了你的代码,我可以使用选项
重现行为%matplotlib notebook
然而
%matplotlib inline
我得到了正确的答复
Bbox(x0=60.0, y0=230.6, x1=125.69999999999999, y1=253.2)
Bbox(x0=317.1, y0=230.6, x1=382.8, y1=253.2)
在第一种情况下,在执行完成之前不会评估图例位置。这是一个证明它的例子,在我执行的第一个单元格中
fig = plt.figure()
plt.plot([0,1],label='Plot')
legend=plt.legend(loc='upper left')
plt.draw()
print(legend.get_window_extent())
输出Bbox(x0=0.0, y0=0.0, x1=1.0, y1=1.0)
。
在下一个单元格中重新评估最后一个表达式
print(legend.get_window_extent())
输出Bbox(x0=88.0, y0=396.2, x1=175.725, y1=424.0)
您可能只需要添加plt.pause()
来强制执行评估。
答案 1 :(得分:1)
您需要将plt.draw()
替换为
plt.gcf().canvas.draw()
或者,如果你有一个数字句柄,fig.canvas.draw()
。这是必需的,因为图例位置仅在绘制画布时确定,之前它只是位于相同的位置。
使用plt.draw()
是不够的,因为绘制图例需要使用后端的有效渲染器。