使用 mpld3 创建动画图片有很多惊人的可能性。然而,似乎所有的“事件部件”都是 JavaScript 的责任。此外,互联网和 Stack Overflow 上有很多请求,人们直接询问这种可能性。
Retrieve Data From Dynamic mpld3 plot in python
Get point information after dragging
How to "dump" points selected with the LinkedBrush plugin for mpld3?
mpld3 ~ Select points and get their coordinates?
其中有引用,但所有答案都是错误的,因为他们建议使用某种警报或标题。然而,第二个链接最有趣,因为它建议添加一些 HTML 表单并按下按钮将数据从“client-javascript”发送到“server-python”。还有一个有趣的笔记本
http://nbviewer.jupyter.org/gist/aflaxman/11156203
它被许多人称为灵感来源 - 它将输出配置保存在 .html 文件中。也许这个硬盘交换可以用来通过 python 进一步处理这些信息。
更进一步,我发现了 IPYwidgets,其中有大量示例甚至是真正交互客户端-服务器的可能性。本质上,我们可能从基本的 slider 和按钮开始,但随后我们看到一些更复杂的包是在此基础上构建的:主要是 bqplot,以及其他一些继承的包。
我想要的 - 只是在图片上拖放一些点,然后将它们传递给 iPython 以进一步绘制一些图 - 它非常复杂并且绝对不能移动到 JavaScript。但似乎尽管 bqplot 团队已经完成了大量工作,但您只能使用一些“预定义”的交互集,因此再次不包括拖放行为。
当我尝试(不是很深入)进入mpld3的源代码并修改它并可能与ipywidgets合并时,我遇到了很多东西都被弃用了,代码发展得非常快,这与现有的例子不符网上:杨树的大多很老,查询也很老。所以我什么也做不了,因为一团糟,很多例子都因为缺乏向后兼容性而失败。
总结。如果有人提供一些方法来拖放点并将它们的坐标传递给 python,我会很高兴,但对我来说更有帮助的是传递信息的能力mpld3 以更“抽象的方式”,以便可以包含其他情况。
最佳答案
自提出问题以来已经过去了将近一年。好吧,答案与 mpld3 无关,但我不拘泥于该特定技术。用户@Drew 建议使用bqplot,所以我发布了一个相关笔记本的链接
https://github.com/bloomberg/bqplot/blob/master/examples/Interactions/Interaction%20Layer.ipynb
来自彭博社。如果你打开它,我建议找到右上角的链接,它将你重定向到带有图片的外部 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'}
{'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]}}, 'old': {}, 'name': '_property_lock', 'type': 'change'}
{'owner': , 'new': array([ 4. , 4.86345378, 6. ]), 'old': array([4, 5, 6]), 'name': 'y', 'type': 'change'}
{'owner': , 'new': array([ 1. , 2.01607846, 3. ]), 'old': array([1, 2, 3]), 'name': 'x', 'type': 'change'}
{'owner': , 'new': {}, 'old': {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”和“的 Unicode是”。
然后你可以跟踪这些变化并相应地在函数 my_callback(...) 中运行一些 python 代码,你甚至可以在这个图中绘制一些东西,或者创建一个新的,等等。令人惊讶的是,这在某种程度上是有效的,并且使用新的 jupyter 你甚至可以用小部件保存笔记本,这完全令人兴奋。
关于javascript - 是否真的可以将数据(回调)从 mpld3 传递到 ipython?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37837210/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife
我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的
我有一个服务模型/表及其注册表。在表单中,我几乎拥有服务的所有字段,但我想在验证服务对象之前自动设置其中一些值。示例:--服务Controller#创建Action:defcreate@service=Service.new@service_form=ServiceFormObject.new(@service)@service_form.validate(params[:service_form_object])and@service_form.saverespond_with(@service_form,location:admin_services_path)end在验证@ser
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案
我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查