【问题标题】:Get Matplotlib legend location?获取 Matplotlib 图例位置?
【发布时间】:2015-02-25 04:52:00
【问题描述】:

我想获取 matplotlib 图例的位置(轴数据或比例的 x、y)。我尝试了以下方法:

l = ax.legend(...)
l.get_window_extent()
l.legendPatch.get_bbox().inverse_transformed(ax.transAxes) 

我的目标是使用图例的位置在旁边添加一个带有附加信息的文本框。

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    获取图例位置的方式取决于图例以及您何时访问它。

    似乎最好在绘制图之后访问图例对象,即在调用之后:

    plt.draw()
    

    之后访问图例对象位置,这将返回您以后可以使用的图形像素。

    访问图例位置至少有两种方式:

    1. 通过.get_window_extent()方法的通用方式
    2. 如果图例通过.get_frame().get_bbox().bounds方法有框架

    显然,如果图例没有框架,则首选第一种方法:-)

    您可以同时使用这两种方法,看看如何最好地处理每种方法。

    下面是一个例子:

    import matplotlib.pyplot as plt
    
    x = y = [1,2,3,4,5]
    
    fig, ax = plt.subplots()
    
    ax.plot(x,y)
    leg = ax.legend(['line 1'], loc=6, frameon=False)
    
    plt.draw()
    
    p = leg.get_window_extent()
    
    ax.annotate('Annotation Text', (p.p0[0], p.p1[1]), (p.p0[0], p.p1[1]), 
                xycoords='figure pixels', zorder=9)
    
    plt.show()
    

    这会产生:

    【讨论】:

    • 当我更改图例的位置时,注释文本不会随着某些位置的图例移动,例如leg = ax.legend(['line 1'], loc='center right', frameon=False)
    【解决方案2】:

    在这行代码

    leg = ax.legend(['line 1'], loc=6, frameon=False)
    

    设置loc=0,这会使您的绘图保持在不会重叠或与您的绘图图重叠最少的最佳位置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-02
      • 2015-12-31
      • 1970-01-01
      • 2021-10-19
      相关资源
      最近更新 更多