Я пытаюсь создать очень простую диаграмму-пирамиду с горизонтальными полосами с эффектом боке, как в этот пример.
Результат, которого я пытаюсь достичь, выглядит следующим образом:
Можно ли создать его с помощью простого дикта вроде этого:
data = {'A': [0.8, 0.85], 'B': [0.31, 0.28], 'C': [0.91, 0.88], 'D': [0.73, 0.78]}
Я не знаю, как мне подготовить свои данные, чтобы они соответствовали графику такого типа.
Это так? :
>>> df = pd.DataFrame([[0.8, 0.85], [0.31, 0.28], [0.91, 0.88], [0.73, 0.78]], index=['A', 'B', 'C', 'D'], columns=['label1', 'label2'])
>>> df
label1 label2
A 0.80 0.85
B 0.31 0.28
C 0.91 0.88
D 0.73 0.78
Я нашел свое решение, которое дало мне такой результат:
Основываясь на примере Population.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