Bokeh vbar аргументы последовательности не одинаковой длины? - PullRequest
0 голосов
/ 05 июня 2019

У меня есть CSV со следующим форматом, который я загружаю в кадр данных:

version, add, subtract, divide, multiply, mod, exp
1.0, 1, 2, 3, 4, 5, 6
1.1, 1, 2, 3, 4, 5, 6
1.2, 1, 2, 3, 4, 5, 6

Я форматирую данные так, чтобы они были в формате DICT:

{
'version' : [1.0, 1.2, 1.3]
'add' : [1, 1, 1]
'subtract' : [2, 2, 2]
'divide' : [3, 3, 3]
'multiply' : [4, 4, 4]
'mod' : [5, 5, 5]
'exp' : [6, 6, 6]
}

Я пытаюсь построить его как стек bokeh vbar в соответствии с примером , найденным здесь . Где ось x - это номер версии с течением времени, а каждый столбец - это столбец с накоплением суммы каждой операции для каждой версии.

Вот мой код:

operations_df = pd.read_csv('the_csv')

# grab versions from first column
op_versions = list(operations_df.iloc[:, 0])

# grab operations from header except version
operations = list(operations_df.columns.values[1:])

data = {'op_verions': op_versions}
# loop through columns appending to dict
for col in operations_df:
    data[col] = list(operations_df[col])

operations_plot = figure(x_range=op_versions, title="Operation Timings")
operations_plot.vbar_stack(operations, x='op_versions' color=Inferno[len(operations)], source=data,
                               legend=[value(x) for x in op_versions])

Все же я получаю ошибку:

Последовательности аргументов ключевых слов для широковещания должны быть одинаковой длины. Получил длины: [3, 6]

Я не понимаю, откуда исходит несоответствие? Есть 3 значения для каждой операции и версии. Я уверен, что это простое исправление, и я не могу видеть, как долго смотрю на него. Единственное место, где есть 6 значений - это количество операций, которое я даю правильному количеству цветов.

1 Ответ

3 голосов
/ 05 июня 2019

3 исходит от

legend=[value(x) for x in op_versions]

Но способ vbar_stack состоит в том, чтобы сделать глиф vbar для каждой "строки" в стеках. В каждом стеке 6 операций, поэтому вам нужно указать 6 имен легенд, по одному для каждой строки. Возможно, вы хотели сделать:

legend=[value(x) for x in operations]

вместо этого? Если я сделаю это (и исправлю несколько других проблем в вашем коде, например, имя столбца в источнике данных для x будет version, а не op_versions, а также передаст список строк в x_range, чтобы получить категорическая ось), то он производит ожидаемый результат:

enter image description here

...