繁体   English   中英

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

[英]Is it actually possible to pass data (callback) from mpld3 to ipython?

使用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传递信息,以便其他案件可以包括在内。

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

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

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

请注意,为了启动具有扩展名bqplotjupyter notebook以及一些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()

你得到一个像这样的好情节: 来自bqplot的随机图

具有拖动点的附加功能。 拖动一个点后,您会看到一个打印的变化列表,这些变化是一个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 ScatterLabel执行此操作,它们都有一个enable_move参数,当您设置为True它们允许拖动点。 此外,当您drag您可以observeScatterLabelxy值的变化,并通过它触发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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM