[英]Is it actually possible to pass data (callback) from mpld3 to ipython?
使用mpld3
创建动画图片有很多惊人的可能性。 但是,似乎所有“移动部件”都是JavaScript的责任。 此外,互联网和Stack Overflow上有很多请求,人们直接要求这种可能性。
如何“转储”使用LinkedBrush插件为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传递信息,以便其他案件可以包括在内。
问题问题已经过去差不多一年了。 嗯,答案不是关于mpld3
,但我不坚持那种特殊的技术。 用户@Drew建议使用bqplot
,所以我发布了一个相关笔记本的链接
https://github.com/bloomberg/bqplot/blob/master/examples/Interactions/Interaction%20Layer.ipynb
来自bloomberg
。 如果您打开它,我建议您找到右上角的链接,该链接会将您重定向到带有图片的外部nbviewer。 几乎所有内容都包含在那里,我只是尝试重现一个简约的工作示例。
请注意,为了启动具有扩展名bqplot
的jupyter notebook
以及一些ipywidgets
,您可能需要做一些“魔术”才能使其正常工作。 你需要熟悉一些bash命令,比如jupyter install nbextension
和jupyter 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()
具有拖动点的附加功能。 拖动一个点后,您会看到一个打印的变化列表,这些变化是一个python
结构,每个事件都在一个单独的行上。
{'owner':,'new':{u'hovered_point':1},'old':traitlets.Undefined,'name':'_ property_lock','type':'change'}
{'所有者':,'新':1,'旧':无,'名称':'hovered_point','类型':'更改'}
{'所有者':,'新':{},'旧':{u'hovered_point':1},'name':'_ property_lock','type':'change'}
{'所有者':,'新':{u'y':{u'type':u'float',u'values':[4,4.863453784620906,6]},u'x':{u'type ':u'float',u'values':[1,2.016078455307904,3]}},'old':{},'name':'_ property_lock','type':'change'}
{'owner':,'new':array([4.,4.86345378,6。]),'old':array([4,5,6]),'name':'y','type': '更改'}
{'owner':,'new':array([1.,2.01607846,3。]),'old':array([1,2,3]),'name':'x','type': '更改'}
{'owner':,'new':{},'old':{u'y':{u'type':u'float',u'values':[4,4.863453784620906,6]},u' x':{u'type':u'float',u'values':[1,20016078455307904,3]}},'name':'_ property_lock','type':'change'}
{'所有者':,'新':{u'hovered_point':无},'old':{},'name':'_ property_lock','type':'change'}
{'所有者':,'新':无,'旧':1,'名称':'hovered_point','类型':'更改'}
{'所有者':,'新':{},'旧':{u'hovered_point':无},'name':'_ property_lock','type':'change'}
我承认结构分解有点棘手,但经过一些仔细的扫视,我们注意到粗线的'name'
等于'_property_lock'
,然后'new'
子结构包含字段u'x'
和u'y'
,它是“x”和“y”的Unicode。
然后你可以跟踪这些变化,并相应地在函数my_callback(...)
运行一些python
代码,你甚至可以在这个情节中画一些东西,或者创建一个新的等等。令人惊讶的是,这种方式有用,并且有了新的jupyter你甚至可以用小部件保存笔记本电脑,这完全是令人费解的。
您可以使用新的bqplot
Scatter
和Label
执行此操作,它们都有一个enable_move
参数,当您设置为True
它们允许拖动点。 此外,当您drag
您可以observe
到Scatter
或Label
的x
或y
值的变化,并通过它触发python函数,从而生成新的图。
明白了吗?
这也不是mpld3
,但这里有一个在jupyter notebook
中使用bqplot
的快速示例,受到Sergey的评论/问题的启发, 是否有可能将数据(回调)从mpld3传递到ipython? 和谢尔盖和德鲁的答案。
首先,在anaconda环境中安装bqplot
并打开笔记本
(... do whatever to make anaconda work for you....)
conda install bqplot
jupyter notebook
然后在第一个块中粘贴这个可调整的交互式散点图代码:
import numpy as np
from __future__ import print_function # So that this notebook becomes both Python 2 and Python 3 compatible
from bqplot import pyplot as plt
# And creating some random data
size = 10
np.random.seed(0)
x_data = np.arange(size)
y_data = np.cumsum(np.random.randn(size) * 100.0)
# Creating a new Figure and setting it's title
plt.figure(title='An adjustable, extractable scatter plot')
# Let's assign the scatter plot to a variable
scatter_plot = plt.scatter(x_data, y_data)
plt.show()
scatter_plot.enable_move = True # make the points movable
然后,在绘图出现后,单击并拖动一个或两个数据点,然后在下一个块中查看绘图中的更改:
print([x_data-scatter_plot.x,y_data-scatter_plot.y])
我原以为https://github.com/bloomberg/bqplot/blob/master/examples/Introduction.ipynb中的回调内容是必需的,但如果你想在修改上触发一些代码,你只需要这样做。
为此,请尝试以下方法:
def foo(change):
print('This is a trait change. Foo was called by the fact that we moved the Scatter')
#print('In fact, the Scatter plot sent us all the new data: ')
#print('To access the data, try modifying the function and printing the data variable')
global pdata
pdata = [scatter_plot.x,scatter_plot.y]
#print (pdata)
# Hook up our function `foo` to the coordinates attributes (or Traits) of the scatter plot
scatter_plot.observe(foo, ['y','x'])
然后, x,y
坐标上的更改会触发foo
并更改全局变量pdata
。 您将看到foo()
的打印输出附加到第一个块的输出,更新的pdata将可用于将来的代码块。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.