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()