如何在matplotlib中获取图例位置

时间:2017-05-02 21:34:57

标签: python matplotlib legend

我试图在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')

获取图例位置的正确方法是什么?

2 个答案:

答案 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()是不够的,因为绘制图例需要使用后端的有效渲染器。