与散景的简单金字塔hbar图表

时间:2018-09-07 10:02:42

标签: python charts bar-chart bokeh

我尝试创建一个非常简单的金字塔图,像this example一样用Bokeh制作水平条。

我想要完成的结果是这样的:

example

是否可以仅使用一个简单的字典来创建它:

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

1 个答案:

答案 0 :(得分:0)

我找到了可以给我这个结果的解决方案: pyramid result

基于示例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