我尝试创建一个非常简单的金字塔图,像this example一样用Bokeh制作水平条。
我想要完成的结果是这样的:
是否可以仅使用一个简单的字典来创建它:
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
答案 0 :(得分:0)
基于示例population.py from Bokeh Github repo,在包含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