【问题标题】:Dynamic visualization bokeh动态可视化散景
【发布时间】:2016-08-06 02:42:37
【问题描述】:

我想表示 Isomap 算法的结果。但我也希望用户选择他想要保留的组件数量。 我为此创建了一个滑块对象,但问题是回调函数在 Javascript 中。因此我不能使用 scikit learn 来更新我的数据。 这是我的代码,有人可以给出一些想法吗? 谢谢

import numpy as np
from bokeh.io import vform
from bokeh.models import CustomJS, ColumnDataSource
from bokeh.plotting import figure, output_file, show
from bokeh.models.widgets import Slider
from sklearn import manifold

output_file("test.html")


X = np.random.randn(1000,20)

Y = np.random.randn(1000,20)

X_isomap = manifold.Isomap(n_neighbors=10, n_components=2).fit_transform(X)

X1 = X_isomap[:,0]
X2 = X_isomap[:,1]

IsoSource = ColumnDataSource(data=dict(x=X1, y=X2,DATA=X))

plot1 = figure(plot_width=400, plot_height=400,tools = "pan,wheel_zoom,box_zoom,reset,resize")
plot1.circle('x', 'y',source=IsoSource,size=7, color="navy")


#sliderCompMDS = Slider(title="n_components MDS",value=2,start=2,end=20,step=1)


callback = CustomJS(args=dict(source=IsoSource),code="""
    var data = source.get('data');
    var f = cb_obj.get('value')
    x = data['x']
    y =data['y']
    X = data['DATA']
    donnees = manifold.Isomap(n_neighbors=10, n_components=f).fit_transform(X)
    x = donnees[:,0]
    y = donnees[:,1]
    source.trigger('change');

    """)

sliderCompIso = Slider(title="n_components Isomap",value=2,start=1,end=20,step=1,callback=callback)



layout = vform(sliderCompIso, plot1)

show(layout)

【问题讨论】:

  • 如果你想从用户交互中触发 python 代码,你需要创建一个 Bokeh 服务器应用。正如您所指出的,CustomJS 回调只能执行 JavaScript,不能执行 python。您可以在此处查看几个示例:github.com/bokeh/bokeh/tree/master/examples/app(单击图像以转到应用程序的实时运行版本)以及在此处找到大量文档:bokeh.pydata.org/en/latest/docs/user_guide/server.html
  • 非常感谢您的链接。它帮助我解决了我的问题
  • @clémentabinader 那么,你呢......分享你的见解?没有什么比看到有人问完全相同的问题但保留所有自己得到的知识更令人沮丧的了。

标签: javascript python dynamic visualization bokeh


【解决方案1】:

首先,最好一次更新整个.data dict。所以,不要这样做:

source2.data['y1'] = Y_MDS[:,0]
source2.data['y2'] = Y_MDS[:,1]

而是先用数据创建一个newdict,然后再做

source2.data = newdata

除此之外,很难说。看起来您每次更新都会发送约 1000 x-y 点?这不是一个不合理的数字,许多例子显示的远不止这些。您确定计算本身不会花费大量时间吗?多长时间:

manifold.Isomap(n_components=w).fit_transform(X)

manifold.MDS(n_components=u).fit_transform(Y)

自己完成?

我的猜测是,这些只是需要一些时间来计算。如果是这样的话,Bokeh 将无能为力。在0.12 中应该有一条“忙碌”消息添加到协议中,因此应用程序可以直观地指示正在发生昂贵的计算。

【讨论】:

  • 我检查了 MDS 的计算时间,发现我所有的问题都来自于此。 (生成网页需要 36 秒,MDS 需要 34 秒)感谢您的帮助
  • 太棒了!正如我所提到的,0.12 应该有一些新的视觉指示器,有助于在事情“忙碌”时向用户显示
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-01
  • 2020-08-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-30
  • 2016-11-27
相关资源
最近更新 更多