Простая пирамида Hbar диаграммы с боке - PullRequest
0 голосов
/ 07 сентября 2018

Я пытаюсь создать очень простую пирамидальную диаграмму о горизонтальных столбцах с боке, как у в этом примере .

Результат, который я пытаюсь достичь, выглядит следующим образом:

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 голосов
/ 07 сентября 2018

Я нашел свое решение, которое дает мне такой результат: pyramid result

Исходя из примера 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
...