散景vbar参数序列的长度不一样吗?

时间:2019-06-05 19:37:56

标签: python pandas bokeh

我有一个.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

我将数据格式化为字典格式:

{
'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]
}

我正在尝试根据example found here将其绘制为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 个答案:

答案 0 :(得分:3)

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