【问题标题】:How can I get and set the position of a draggable legend in matplotlib如何在 matplotlib 中获取和设置可拖动图例的位置
【发布时间】:2014-01-09 13:32:14
【问题描述】:

我正在尝试在 matplotlib 中获取和设置可拖动图例的位置。我的应用程序包含一个交互式 GUI,它有一个重绘/绘图功能,应该执行以下步骤:

  1. 保存当前图例的位置。
  2. 清除当前坐标区并执行各种绘图操作,这些操作可能会或可能会为其绘图添加标签。
  3. 构建新的可拖动图例 (ax.legend().draggable()) 并恢复图例的旧位置。

在这些步骤之间,用户可以随意拖动图例,目标是在重新绘制绘图时保持图例位置。

我的第一种方法是在第 1 步和第 3 步中使用 oldpos = legend.get_bbox_to_anchor()legend.set_bbox_to_anchor(oldpos)。但这会导致图例完全移出可见区域。

请注意,我必须使用ax.legend(),而不能使用fig.legend(lines, labels),因为第2步是完全解耦的,也就是说,我对第3步中的线条和标签一无所知。根据问题@987654321的答案@关于轴或图形坐标的这两种可能性之间似乎存在差异。显然我的问题需要图形坐标,但我还没有完全理解如何将 bbox 转换为“图形坐标中的 bbox”。

我刚刚意识到的更严重的问题是,显然legend.get_bbox_to_anchor() 似乎总是返回相同的值,而不管拖动位置如何。那么也许锚只能(ab-)用于操纵静态图例的位置?是否有另一种/正确的方法来保存和恢复可拖动图例的位置?

【问题讨论】:

    标签: matplotlib draggable legend


    【解决方案1】:

    通过查看Legend 的实现,我发现有一个未记录的属性_loc,这正是我想要的。我的解决方案现在看起来非常简单:

    oldLegPos = ax.get_legend()._loc
    
    # perform all plotting operations...
    
    legend = ax.legend().draggable()
    legend._loc = oldLegPos
    

    看起来_loc 自动存储图形坐标,因为我不必以任何方式转换坐标(例如,当绘图操作完全改变轴范围/坐标时)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-02
      • 2011-06-21
      • 1970-01-01
      • 2011-02-02
      • 1970-01-01
      • 2018-06-23
      相关资源
      最近更新 更多