2014-01-09 21 views
1

我试图获取并设置matplotlib中可拖动图例的位置。我的应用程序由一个交互式GUI组成,它具有重绘/绘图功能,可执行以下步骤:我如何获得并设置matplotlib中可拖动图例的位置

  1. 保存当前图例的位置。
  2. 清除当前坐标轴并执行各种绘图操作,这些操作可能会或可能会将标签添加到其绘图中。 ()并恢复图例的旧位置。

在这些步骤之间,用户可以自由拖动图例,目标是在绘制图表时保留图例位置。

我的第一种方法是在步骤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

通过查看Legend的执行情况,我发现有一个无证的属性_loc,它正是我想要的。我的解决方案现在看起来惊人的简单:

oldLegPos = ax.get_legend()._loc 

# perform all plotting operations... 

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

它看起来像_loc自动存储数字坐标,因为我没有坐标转换以任何方式(例如,当绘图操作彻底改变轴范围/坐标)。 。

相关问题