当前位置: 首页 > 面试题库 >

如何在matplotlib中创建可拖动的图例?

颜新
2023-03-14
问题内容

我正在matplotlib中的轴对象上绘制图例,但是声称将其放置在智能位置的默认定位似乎不起作用。理想情况下,我希望图例可由用户拖动。如何才能做到这一点?


问题答案:

注意:现在已内置到matplotlib中

leg = plt.legend()
if leg:
    leg.draggable()

将按预期工作

好吧,我发现解决方案的点点滴滴分散在邮件列表中。我提出了一个很好的模块化代码块,您可以插入并使用…在这里:

class DraggableLegend:
    def __init__(self, legend):
        self.legend = legend
        self.gotLegend = False
        legend.figure.canvas.mpl_connect('motion_notify_event', self.on_motion)
        legend.figure.canvas.mpl_connect('pick_event', self.on_pick)
        legend.figure.canvas.mpl_connect('button_release_event', self.on_release)
        legend.set_picker(self.my_legend_picker)

    def on_motion(self, evt):
        if self.gotLegend:
            dx = evt.x - self.mouse_x
            dy = evt.y - self.mouse_y
            loc_in_canvas = self.legend_x + dx, self.legend_y + dy
            loc_in_norm_axes = self.legend.parent.transAxes.inverted().transform_point(loc_in_canvas)
            self.legend._loc = tuple(loc_in_norm_axes)
            self.legend.figure.canvas.draw()

    def my_legend_picker(self, legend, evt): 
        return self.legend.legendPatch.contains(evt)

    def on_pick(self, evt): 
        if evt.artist == self.legend:
            bbox = self.legend.get_window_extent()
            self.mouse_x = evt.mouseevent.x
            self.mouse_y = evt.mouseevent.y
            self.legend_x = bbox.xmin
            self.legend_y = bbox.ymin 
            self.gotLegend = 1

    def on_release(self, event):
        if self.gotLegend:
            self.gotLegend = False

…以及您的代码中…

def draw(self): 
    ax = self.figure.add_subplot(111)
    scatter = ax.scatter(np.random.randn(100), np.random.randn(100))


legend = DraggableLegend(ax.legend())

我给Matplotlib-users组发送了电子邮件,John Hunter很好,可以将我的解决方案添加到SVN HEAD中。

2010年1月28日星期四,下午3:02,亚当·弗雷泽(Adam Fraser)写道:

我以为我会分享一个可拖动的图例问题的解决方案,因为它使我永远吸收了邮件列表中所有分散的知识…

很酷-很好的例子。我将代码添加到legend.py。现在你可以做

腿= ax.legend()
leg.draggable()

启用可拖动模式。您可以反复调用此功能来切换可拖动状态。

我希望这对使用matplotlib的人有所帮助。



 类似资料:
  • 如何在Javafx 2.0中制作可拖动节点。JavaFX专门用于GUI目的,仅我需要一些示例,谢谢

  • 我目前使用matplotlib以以下方式生成图例: 这在某种程度上是可行的,见1。但我在我的传奇中复制了信息。 我宁愿把传说分开。所以我有不同颜色的线对应于时间t,一条法线作为我的解析解,一个点作为我的模拟结果。 诸如此类 --(红线)t=25 --(蓝线)t=50 --(绿线)t=500 模拟 --解析解 现在有人知道我如何用matplotlib实现这一点了吗?

  • 问题内容: 我在网上搜索了可拖动的Swing组件的示例,但发现示例不完整或不起作用。 我需要的是一个 Swing组件 ,可以用鼠标将其 拖动 到另一个组件中。在拖动时,它应该 已经改变 了位置,而不仅仅是“跳转”到目的地。 我将感谢没有非标准API的示例。 谢谢。 问题答案: 我提出了一个简单但可行的解决方案,我自己找到了;) 我该怎么办? 当按下鼠标时,我 在屏幕上* 记录了 光标的 位置以及

  • 我可以访问figure实例。我知道在这个图中有一个图例,我可以通过。现在我想更改图例的属性。其中一些我可以通过设置器访问,比如。 创建图例时,它接受多个关键字参数: 类matplotlib。传奇传奇(父项、句柄、标签、loc=None、numpoints=None、markerscale=None、scatterpoints=None、scatteryoffsets=None、prop=None、

  • 本文向大家介绍如何使用JavaScript和CSS创建可拖动的HTML元素?,包括了如何使用JavaScript和CSS创建可拖动的HTML元素?的使用技巧和注意事项,需要的朋友参考一下 要使用JavaScript和CSS创建可拖动的HTML元素,代码如下- 示例 输出结果 上面的代码将产生以下输出- 通过拖动来移动div时-

  • 问题内容: 我将一些matlpotlib函数集成到了一些django-celery任务中。 每次调用任务时,都会将更多RAM专用于python。不久之后,python占用了所有RAM。 问题: 如何释放此内存? 更新2-第二种解决方案: 我问过类似的问题,特别是有关内存锁定matplotlib错误的时候,但是我有一个很好的回答这个问题,以及如果使用多进程运行在单独的进程中绘图功能,其内存会自动释放