Python Matplotlib-恢复可拖动图例位置

Python Matplotlib-恢复可拖动图例位置,python,matplotlib,Python,Matplotlib,我正在尝试恢复图例位置,一旦图形被删除并再次添加到画布。图例是使用 leg=ax.legend(bbox_to_anchor=(0.99,0.99) , loc='upper right') leg.draggable(True,use_blit=True,update='bbox') 我正在使用update='bbox'在拖动图例后更新bbox位置 还原时,我使用的是get_bbox\u to_anchor,这会给我一个TransformedBbox 如果我不拖拽传奇的话 Transform

我正在尝试恢复图例位置,一旦图形被删除并再次添加到画布。图例是使用

leg=ax.legend(bbox_to_anchor=(0.99,0.99) , loc='upper right')
leg.draggable(True,use_blit=True,update='bbox')
我正在使用
update='bbox'
在拖动图例后更新bbox位置

还原时,我使用的是
get_bbox\u to_anchor
,这会给我一个
TransformedBbox

如果我不拖拽传奇的话

TransformedBbox(Bbox([[0.99, 0.99], [0.99, 0.99]]), BboxTransformTo(TransformedBbox(Bbox([[0.125, 0.1], [0.9, 0.9]]), BboxTransformTo(TransformedBbox(Bbox([[0.0, 0.0], [12.975, 8.1375]]), Affine2D(array([[ 80.,   0.,   0.],
   [  0.,  80.,   0.],
   [  0.,   0.,   1.]]))))))) 
如果我拖动图例

TransformedBbox(Bbox([[485382.883642, 190633.226933], [485382.883642, 190633.226933]]), BboxTransformTo(TransformedBbox(Bbox([[0.125, 0.1], [0.9, 0.9]]), BboxTransformTo(TransformedBbox(Bbox([[0.0, 0.0], [12.975, 8.1375]]), Affine2D(array([[ 80.,   0.,   0.],
   [  0.,  80.,   0.],
   [  0.,   0.,   1.]])))))))
现在我有了
bbox
transform
使用

transformedbbox=leg.get_bbox_to_anchor()
bbox= transformedbbox.inverse_transformed(ax.transAxes)
 # print bbox
 # Bbox(x0=485382.883642, y0=190633.226933, x1=485382.883642, y1=190633.226933)
transform= transformedbbox._transform
# print transform
# BboxTransformTo(TransformedBbox(Bbox([[0.125, 0.1], [0.9, 0.9]]), BboxTransformTo(TransformedBbox(Bbox([[0.0, 0.0], [12.975, 8.1375]]), Affine2D(array([[ 80.,   0.,   0.],
   [  0.,  80.,   0.],
   [  0.,   0.,   1.]]))))))
我使用它们来恢复图例,使用
set_bbox\u to_anchor
,它接受bbox和transform

leg.set_bbox_to_anchor(bbox,transform)
但我的传奇故事离这个人物越来越远(几英里远)

很可能我在提取转换时出错了。提取bbox并转换信息以与
一起使用的正确方法是什么

更新:

(如果
get_bbox\u to_anchor
应在轴坐标框中给出输出)

Lib\site packages\matplotlib\legend.py
文件的方法
def\u update\u bbox\u to\u锚定(画布中的self、loc\u)

如果我换线

tr = self.legend.axes.transAxes
tr = self.legend.axes.transAxes

拖动图例
get_bbox_到_锚定后
输出:

TransformedBbox(Bbox([[0.341489285295, 0.433591056494], [0.341489285295, 0.433591056494]]), BboxTransformTo(TransformedBbox(Bbox([[0.125, 0.1], [0.9, 0.9]]), BboxTransformTo(TransformedBbox(Bbox([[0.0, 0.0], [12.975, 8.1375]]), Affine2D(array([[ 80.,   0.,   0.],
   [  0.,  80.,   0.],
   [  0.,   0.,   1.]])))))))
看起来很像坐标系中的点

但在使用这些点时,图例的位置有一个小的偏移

更改图例
loc
会更改移位的方向和幅度。 (左下
最低,右上最高)

更新2

最小工作示例

import matplotlib.pyplot as plt
fig_dict=[]
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(range(10), label='Test')
legend = ax.legend(loc='upper right',bbox_to_anchor=(0.99,0.99))
legend.draggable(True,use_blit=True,update='bbox')


fig.canvas.draw()

def on_scroll(event):
    print legend.get_bbox_to_anchor()

fig.canvas.mpl_connect('scroll_event', on_scroll)

fig.show()
此示例在滚动时将
get\u bbox\u的输出打印到\u anchor

将方法更改为锚定(画布中的self、loc)前后拖动图例后,比较滚动的输出
Lib\site packages\matplotlib\legend.py

通过更换线路


我认为你应该把这个问题展示出来,这样人们就可以复制它。否则你会在这里有一段很长的独白。请只阅读更新标题后的部分。。。我在github上也提出了一个问题…只读更新2。。。。我加了一个例子。。
tr = self.legend.axes.transAxes
tr = self.legend.axes.transAxes.inverted()