Holoviews, накладывать разные VLine для каждого кадра HoloMap - PullRequest
0 голосов
/ 21 июня 2019

Я пытаюсь использовать следующий код для создания точечной диаграммы вместе с вертикальной линией среднего значения оси 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 Ответ

1 голос
/ 22 июня 2019

Вы были почти там, вам просто нужно было поместить каждый VLine (с соответствующим образом вычисленным средним значением подмножества) в HoloMap.Следующее явно вводит HoloMap через dict.

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') 
)
...