Holoviews为HoloMap的每一帧覆盖一个不同的VLine

时间:2019-06-20 21:39:26

标签: python overlay holoviews

我正在尝试使用以下代码创建散点图以及x轴平均值的垂直线,但是我需要一些帮助来实现它。

import pandas as pd
import holoviews as hv
hv.extension('bokeh')

df = pd.DataFrame({'group': ['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C'],
                   'x': [3, 4, 5, 2, 2, 3, 5, 4, 7],
                   'y': [10, 8, 9, 3, 7, 6, 5, 4, 8]})

m1 = df['x'].mean()
line1 = hv.VLine(m1)
line1.opts(color='red', line_dash='dashed')    
ds = hv.Dataset(df, kdims=['group'], vdims=['x', 'y'])
scatter = ds.to(hv.Scatter, 'x', 'y')
scatter.opts(width=400, height=400, size=10,
             tools=['hover'], xlim=(0, 11), ylim=(0, 11))
layout = scatter * line1
hv.save(layout, 'means0.html')

enter image description here 它与散点图一样按预期工作,并且当更改“组”维时会更改绘制的点,但均值的垂直线仅针对整个数据帧计算一次,我也不知道该如何实现该元素的交互性。意思是每当我要更改“组”维以计算所选“组”的均值并按点绘制其平均值时。

1 个答案:

答案 0 :(得分:1)

您快到了,您只需要将每个VLine(以及相应计算出的子集的平均值)放入HoloMap中即可。以下通过命令显式初始化HoloMap。

import pandas as pd
import holoviews as hv
hv.extension('bokeh')

df = pd.DataFrame({'group': ['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C'],
                   'x': [3, 4, 5, 2, 2, 3, 5, 4, 7],
                   'y': [10, 8, 9, 3, 7, 6, 5, 4, 8]})
hm = hv.HoloMap({
    group: hv.Scatter(df.loc[df.group==group], 'x', 'y') * hv.VLine(df.loc[df.group==group, 'x'].mean())
    for group in df.group.unique()
})

hm.opts(
    opts.Scatter(width=400, height=400, size=10,
                 tools=['hover'], xlim=(0, 11), ylim=(0, 11)),
    opts.VLine(color='red', line_dash='dashed') 
)