如何创建具有多个独立 DynamicMap 绘图的 Holoviews 应用程序?
How to create a Holoviews app with multiple independent DynamicMap plots?
我正在尝试使用全息视图创建 DynamicMap 类型图的网格布局(比如 2x2)。
这将用作 Holoviews/Bokeh 应用程序。
创建 dmap 后,我使用
布置它们
layout = hv.Layout([dmap1, dmap2]).cols(2)
此布局并排生成两个图
我面临的问题是,默认情况下,每个动态地图的小部件都聚集在行的右侧,与绘图没有视觉关联(地图工具栏也合并为一个)。
此外,如果我将两个以上的 dmap 传递给布局,则会出现错误:
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 个 独立 可控动态图的网格。
这里有很多东西要解压,所以让我开始回答这个问题:
the widgets for each Dynamic Map get clustered to the right of the row
如果您想要独立的小部件集,则必须手动构建每组小部件并自行构建生成的散景模型。这个例子演示了这种方法:
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,然后使用渲染器生成单独的绘图和小部件,然后使用散景行布局组合它们。如您所见,我们还可以为小部件定义一个位置,而不是将它们放在右侧,而是放在顶部。
the maps toolbars also get combined into just one
在 this recent PR 中添加了一个新的 merge_tools
选项以允许在单个布局中使用单独的工具栏。
Moreover, If I pass more than two dmaps to the layout, I get an error:
这可能是由于 return 连接了一个相邻的对象,目前在 DynamicMap 中不允许这样做。您是否有机会使用 .hist
方法?如果是这样,请尝试在 DynamicMap
上调用它,而不是让 DynamicMap
return 一个带有相邻 Histogram
.
的对象
我正在尝试使用全息视图创建 DynamicMap 类型图的网格布局(比如 2x2)。 这将用作 Holoviews/Bokeh 应用程序。
创建 dmap 后,我使用
布置它们layout = hv.Layout([dmap1, dmap2]).cols(2)
此布局并排生成两个图 我面临的问题是,默认情况下,每个动态地图的小部件都聚集在行的右侧,与绘图没有视觉关联(地图工具栏也合并为一个)。
此外,如果我将两个以上的 dmap 传递给布局,则会出现错误:
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 个 独立 可控动态图的网格。
这里有很多东西要解压,所以让我开始回答这个问题:
the widgets for each Dynamic Map get clustered to the right of the row
如果您想要独立的小部件集,则必须手动构建每组小部件并自行构建生成的散景模型。这个例子演示了这种方法:
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,然后使用渲染器生成单独的绘图和小部件,然后使用散景行布局组合它们。如您所见,我们还可以为小部件定义一个位置,而不是将它们放在右侧,而是放在顶部。
the maps toolbars also get combined into just one
在 this recent PR 中添加了一个新的 merge_tools
选项以允许在单个布局中使用单独的工具栏。
Moreover, If I pass more than two dmaps to the layout, I get an error:
这可能是由于 return 连接了一个相邻的对象,目前在 DynamicMap 中不允许这样做。您是否有机会使用 .hist
方法?如果是这样,请尝试在 DynamicMap
上调用它,而不是让 DynamicMap
return 一个带有相邻 Histogram
.