实际上是否可以将数据(回调)从mpld3传递给ipython?

Ser*_*gal 6 javascript python mpld3 ipywidgets

使用创建动画图片有很多惊人的可能性mpld3.但是,似乎所有"移动部件"都是JavaScript的责任.此外,互联网和Stack Overflow上有很多请求,人们直接要求这种可能性.

从python中的动态mpld3绘图中检索数据

拖动后获取点信息

如何"转储"使用LinkedBrush插件为mpld3选择的点数?

mpld3~选择点并获取它们的坐标?

其中有引用,但所有答案都错了,因为他们建议使用某种警报或标题.然而,第二个链接最有趣,因为它建议添加一些HTML表单并按下按钮以从"client-javascript"将数据发送到"server-python".还有一个有趣的笔记本

http://nbviewer.jupyter.org/gist/aflaxman/11156203

这被很多人提到作为灵感来源 - 它将输出配置保存为.html文件.也许这个硬盘交换可以用来通过python进一步处理这些信息.

我发现IPYwidgets,通过大量示例甚至是TRUE交互客户端 - 服务器的可能性,我进一步发现了这一点.从本质上讲,我们可以从基本的滑块和按钮开始,但后来我们看到在此基础上构建了一些更复杂的包:主要是bqplot和其他一些继承的包.

我想要的 - 只是拖放图片上的一些点,然后将它们传递给iPython进行更多的绘图 - 它非常复杂,绝对无法移动到JavaScript.但似乎尽管团队bqplot做了大量工作,但您只能使用一些"预定义"的交互集,因此再次不包括拖放行为.

当我尝试(不是非常深入地)输入mpld3的源代码并修改它并可能与ipywidgets合并时,我遇到很多东西都被弃用了,代码发展得非常快,这与互联网上现有的例子不一致:大多数杨树都很旧,询问也很老.所以我因为混乱而无能为力,许多例子由于缺乏向后兼容性而失败.

摘要.我很高兴,如果有人提供了一些方法来拖放点并将他们的坐标传递给python,但这对我更有帮助 - 是能够以更"抽象的方式"从mpld3传递信息,以便其他案件可以包括在内.

Ser*_*gal 5

距离提出这个问题已经过去了快一年了。嗯,答案不是关于mpld3,但我不坚持那种特定的技术。用户 @Drew 建议使用bqplot,所以我发布了相关笔记本的链接

https://github.com/bloomberg/bqplot/blob/master/examples/Interactions/Interaction%20Layer.ipynb

bloomberg。如果您打开此链接,我建议您找到右上角的链接,该链接会将您重定向到带有图片的外部 nbviewer。几乎所有内容都包含在那里,我只是尝试重现一个简约的工作示例。

请注意,为了启动jupyter notebookwith 扩展bqplot以及 some ipywidgets,您可能需要执行某种“魔法”才能使其工作。您需要熟悉一些 bash 命令,例如jupyter install nbextensionjupyter nbextension enable。我个人不得不奋斗bqplot几个小时才能使其发挥作用。但这显然是一个单独的问题。

让我们尝试一下启动该功能observe。测试函数my_callback(...)只是打印事件。

%matplotlib inline
from bqplot import pyplot as plt

def my_callback(change):
    print change

scatt = plt.scatter([1,2,3],[4,5,6],enable_move=True)
scatt.observe(my_callback)
plt.show()
Run Code Online (Sandbox Code Playgroud)

你会得到一个像这样的漂亮情节: bqplot 的随机图

具有拖动点的附加功能。一旦拖动一个点,您就会观察到打印的更改列表,该列表是一个python结构,每个事件都在单独的行上。

在此输入图像描述

{'owner': , 'new': {u'hovered_point': 1}, 'old': Traitlets.Undefined, 'name': '_property_lock', 'type': 'change'}

{'owner': , 'new': 1, 'old': None, 'name': 'hovered_point', 'type': 'change'}

{'owner': , 'new': {}, 'old': {u'hovered_point': 1}, 'name': '_property_lock', 'type': 'change'}

{'owner': , 'new': {u'y': {u'type': u'float', u'values': [4, 4.863453784620906, 6]}, u'x': {u'type ': u'float', u'values': [1, 2.016078455307904, 3]}}, '旧': {}, 'name': '_property_lock', 'type': 'change'}

{'所有者': , '新': 数组([ 4. , 4.86345378, 6. ]), '旧': 数组([4, 5, 6]), '名称': 'y', '类型': '改变'}

{'所有者': , '新': 数组([ 1. , 2.01607846, 3. ]), '旧': 数组([1, 2, 3]), '名称': 'x', '类型': '改变'}

{'所有者': , '新': {}, '旧': {u'y': {u'type': u'float', u'values': [4, 4.863453784620906, 6]}, u' x': {u'type': u'float', u'values': [1, 2.016078455307904, 3]}}, 'name': '_property_lock', 'type': 'change'}

{'owner': , 'new': {u'hovered_point': None}, 'old': {}, 'name': '_property_lock', 'type': 'change'}

{'owner': , 'new': None, 'old': 1, 'name': 'hovered_point', 'type': 'change'}

{'owner': , 'new': {}, 'old': {u'hovered_point': None}, 'name': '_property_lock', 'type': 'change'}

我承认这个结构分解起来有点棘手,但仔细一看,我们注意到粗线有'name'等于'_property_lock',然后子'new'结构包含字段u'x'u'y',这是“x”和“y”的Unicode。

然后你可以跟踪这些变化并相应地python在函数内运行一些代码my_callback(...),你甚至可以在这个图中画一些东西,或者创建一个新的,等等。令人惊讶的是,这在某种程度上是有效的,使用新的 jupyter 你甚至可以用小部件保存笔记本这完全令人兴奋。