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

标签 matplotlib draggable legend

我正在尝试获取并设置 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 中的线条和标签一无所知。根据问题 How to position and align a matplotlib figure legend? 的答案关于轴或图形坐标,这两种可能性之间似乎存在差异。显然我的问题需要图形坐标,但我还没有完全理解如何将 bbox 转换为“图形坐标中的 bbox”。

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

最佳答案

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

oldLegPos = ax.get_legend()._loc

# perform all plotting operations...

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

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

关于matplotlib - 如何在 matplotlib 中获取和设置可拖动图例的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21021685/

相关文章:

python - 在子图中写入文本

delphi - 在网格上拖动时拖动图像更改

javascript - 错误,在 Chrome 中,带有可拖动元素,当我放下它时,许多 div 会消失

Highcharts:多个传说可能吗?

python - 如何通过交互包装函数修改matplotlibFig,ax对象?

python - Matplotlib 保存按钮在嵌入式 Tkinter 窗口中不起作用

Python - 在 mplot3D 中设置 zlim

ios - 使 UIView 可以用手指拖动

r - 如何删除向量中的未知空格?

r - 如何向 Facet_Grid strip 标签添加希腊字母?