Я нашел свое решение, которое дает мне такой результат:
Исходя из примера pop.py из репозитория Bokeh Github , после включения import pandas as pd
я изменил только следующий код:
gender_transform = CustomJSTransform(args=dict(source=ages), func="", v_func="""
var val = new Float64Array(xs.length)
for (var i = 0; i < xs.length; i++) {
if (source.data['Label'][i] == 'label1') # <--- This line only
val[i] = -xs[i]
else
val[i] = xs[i]
}
return val
""")
groups = ['A', 'B', 'C', 'D'] # <--- Override the age group
pyramid = figure(plot_width=600, plot_height=500, toolbar_location=None, y_range=groups,
title="label1 vs label2",
x_axis_label="",y_axis_label="", x_range=[-1, 1])
pyramid.hbar(y="NameGrp", height=0.5, right=transform('Value', gender_transform),
source=ages, legend="Label", line_color="white",
fill_color=factor_cmap('Label', palette=["blue", "red"], factors=["label1", "label2"]))
А затем мои данные строятся следующим образом в методе update()
:
>>> ages = pd.DataFrame([['A', 'label1', 0.85], ['B', 'label1', 0.28], ['C', 'label1', 0.88], ['D', 'label1', 0.78], ['A', 'label2', 0.80], ['B', 'label2', 0.18], ['C', 'label2', 0.98], ['D', 'label2', 0.88]], columns=['NameGrp', 'Label', 'Value'])
>>>
NameGrp Label Value
0 A label1 0.85
1 B label1 0.28
2 C label1 0.88
3 D label1 0.78
4 A label2 0.80
5 B label2 0.18
6 C label2 0.98
7 D label2 0.88