Matplotlib - 恢复可拖动的传奇位置

时间:2017-05-24 14:39:50

标签: 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_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.]])))))))

现在我使用

bboxtransform
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.]]))))))

我使用它们来使用接受bbox和转换的set_bbox_to_anchor来恢复图例。

leg.set_bbox_to_anchor(bbox,transform)

但是我的传说远离这个人物(数英里远)。

我很可能在提取变换方面犯了一些错误。提取bbox和转换信息以便与set_bbox_to_anchor一起使用的正确方法是什么。

更新

(如果get_bbox_to_anchor应该在轴坐标系中给出输出)

def _update_bbox_to_anchor(self, loc_in_canvas)文件的方法Lib\site-packages\matplotlib\legend.py

如果我换行

tr = self.legend.axes.transAxes

tr = self.legend.axes.transAxes.inverted()

拖动图例get_bbox_to_anchor输出后:

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会更改班次的方向和幅度。 (lower left最低,upper right最高

更新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_bbox_to_anchor的输出

def _update_bbox_to_anchor(self, loc_in_canvas)文件的方法Lib\site-packages\matplotlib\legend.py进行更改之前和之后拖动图例后比较滚动的输出

替换行

tr = self.legend.axes.transAxes

tr = self.legend.axes.transAxes.inverted()

0 个答案:

没有答案