如何使用多个独立的DynamicMap图创建Holoviews应用程序?

时间:2018-02-04 17:30:06

标签: python matplotlib plot bokeh holoviews

我正在尝试使用holoviews创建DynamicMap类型图的网格布局(比方说2x2)。 这将作为Holoviews / Bokeh应用程序。

创建我的dmaps后,我使用

将它们展开
layout = hv.Layout([dmap1, dmap2]).cols(2)

这种布局并排产生两个图 我面临的问题是,默认情况下,每个动态地图的小部件都聚集到行的右侧,没有与绘图的可视关联(地图工具栏也只能合并为一个)。

此外,如果我向布局传递两个以上的dmaps,我会收到一个错误:

TypeError: DynamicMap does not accept AdjointLayout type, data elements have to be a ('ViewableElement', 'NdMapping', 'Layout'). 

我在服务器模式下使用渲染器:

renderer = hv.renderer('bokeh')
renderer = renderer.instance(mode='server')

总之,我想要一个超过2个独立可控制动态图的网格。

1 个答案:

答案 0 :(得分:1)

这里要解压很多,所以让我开始回答这个问题:

  

每个动态地图的小部件都聚集在行的右侧

如果您需要独立的小部件集,则必须手动构建每组小部件并自行组合生成的散景模型。此示例演示了此方法:

import numpy as np
import holoviews as hv

from bokeh.io import curdoc
from bokeh.layouts import row

renderer = hv.renderer('bokeh').instance(mode='server')

dmap1 = hv.DynamicMap(lambda x: hv.Curve(np.random.rand(10)), kdims='x').redim.range(x=(0,5))
dmap2 = hv.DynamicMap(lambda y: hv.Scatter(np.random.rand(10)), kdims='y').redim.range(x=(0,5))

widget1 = renderer.get_widget(dmap1, None, position='above').state
widget2 = renderer.get_widget(dmap2, None, position='above').state

r = row(widget1, widget2)

doc = curdoc()
doc.add_root(r)

我们创建两个独立的DynamicMaps,然后使用渲染器生成单独的绘图和小部件,然后使用散景行布局组合它们。正如您所看到的,我们还可以为小部件定义一个位置,而不是将它们放在右侧,而不是将它们放在顶部。

  

地图工具栏也可以合并为一个

this recent PR中添加了一个新的merge_tools选项,以允许在单个布局中使用单独的工具栏。

  

此外,如果我向布局传递两个以上的dmaps,我会收到一个错误:

这可能是由于返回了一个相邻的对象,目前在DynamicMap中是不允许的。您是否有机会使用.hist方法?如果是这样,请尝试在DynamicMap上调用它,而不是让DynamicMap返回一个具有相邻Histogram的对象。