如何在matplotlib中获取和设置可拖动图例的位置

时间:2014-01-09 13:32:14

标签: matplotlib draggable legend

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

  1. 保存当前图例的位置。
  2. 清除当前轴并执行各种绘图操作,这些操作可能会或可能会在其图形中添加标签。
  3. 构建一个新的可拖动图例(ax.legend().draggable())并恢复图例的旧位置。
  4. 在这些步骤之间,用户可以自由地拖动图例,目标是在重绘图时保持图例位置。

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

    请注意,我必须使用ax.legend()并且不能使用fig.legend(lines, labels),因为第2步完全解耦,即我对步骤3中的行和标签一无所知。根据答案问题How to position and align a matplotlib figure legend?这两种关于轴或图形坐标的可能性之间似乎存在差异。显然我的问题需要图形坐标,但我还没有完全理解如何将bbox转换为“图坐标中的bbox”。

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

1 个答案:

答案 0 :(得分:2)

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

oldLegPos = ax.get_legend()._loc

# perform all plotting operations...

legend = ax.legend().draggable()
legend._loc = oldLegPos

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