自从提出这个问题以来,已经过去了将近一年。好吧,答案不是关于mpld3
,但我不坚持那种特定的技术。用户@Drew 建议使用bqplot
,所以我发布了一个相关笔记本的链接
https://github.com/bloomberg/bqplot/blob/master/examples/Interactions/Interaction%20Layer.ipynb
从bloomberg
. 如果您打开它,我建议您在右上角找到链接,该链接会将您重定向到带有图片的外部 nbviewer。几乎所有内容都包含在那里,我只是尝试重现一个简约的工作示例。
请注意,为了启动jupyter notebook
with extensionbqplot
以及 some 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': '改变'}
{'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, 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,您甚至可以使用小部件保存笔记本这是完全令人兴奋的。