Python 如何在matplotlib中获取图例位置

Python 如何在matplotlib中获取图例位置,python,matplotlib,legend,Python,Matplotlib,Legend,我正在尝试获取matplotlib中的图例位置。看起来像是Legend.get\u window\u extent()应该提供这个值,但是不管Legend位于何处,它都返回相同的值。以下是一个例子: from matplotlib import pyplot as plt def get_legend_pos(loc): plt.figure() plt.plot([0,1],label='Plot') legend=plt.legend(loc=loc)

我正在尝试获取matplotlib中的图例位置。看起来像是Legend.get\u window\u extent()应该提供这个值,但是不管Legend位于何处,它都返回相同的值。以下是一个例子:

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')

获取图例位置的正确方法是什么试试这个:

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中尝试了您的代码,我可以使用option复制该行为

%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()
来强制执行评估。

您需要将
plt.draw()
替换为

plt.gcf().canvas.draw()
或者,如果您有一个图形句柄,
fig.canvas.draw()
。这是必要的,因为图例位置仅在绘制画布时确定,而在画布位于同一位置之前


使用
plt.draw()
是不够的,因为绘制图例需要使用后端的有效渲染器

可能有点离题,但可能您正在尝试查找最佳图例位置,但matplotlib已经具有此功能。使用
loc=0
将图例放置在“最佳”位置。这是一个很好的点…我知道loc=0(或loc='best')…我想做的是在使用loc=0后找出图例的位置,这样我可以在它周围放置其他东西。这对我来说也很有用,但我更喜欢更直接的东西。