在Bokeh中创建多系列折线图

时间:2017-12-27 09:39:14

标签: python bokeh linechart

你好,我有以下数据:

month_id            class   count
201612              B       69
201612              G       54
201612              P       31
201612              S       42
201612              V       89
201612              Other   77
201701              B       87
201701              G       79
201701              P       96
201701              S       68
201701              V       08
201701              Other   653
201702              B       67
201702              G       82
201702              P       60
201702              S       46
201702              V       96
201702              Other   72
201703              B       94
201703              G       62
201703              P       95

现在我想展示每个班级的计数在month_id&line-chart中的变化情况。如下所示。

enter image description here

因此x轴将具有month_id'并且每个类将有6行,y轴将用于计数。我的数据是df2。

我尝试过以下操作:

# Create new column to make plotting easier
df2['class_date'] = df2['class'] + "-" + df2['month_id'].map(str)

# x and y axes
class_date = df2['class_date'].tolist()
count = df2['count'].tolist()

# Bokeh's mapping of column names and data lists
numlines=len(df2.class.unique())
mypalette=Spectral11[0:numlines]

plot = figure(plot_width= 800 , plot_height=350)
plot.multi_line(xs= [class_date]*numlines , ys=[count],
             line_color=mypalette,line_width= 3)
show(plot)

然而,这给了我以下错误:

Bokeh Error
Cannot read property 'length' of undefined

有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

multi_line的数据格式不正确。它期望列表列表(或数组列表等),其中每个子列表具有每个不同行的坐标。相比之下,你正在做的是一个(平面)列表:

In [1]: lst = [1,2,3]

In [2]: lst*3
Out[2]: [1, 2, 3, 1, 2, 3, 1, 2, 3]

您的数据需要看起来像:

xs = [
    [ <list of x coords for line 1> ], 
    [ <list of x coords for line 2> ],
    ...
]

同样适用于ys。但是,如果您只有六行显示,我可能会建议只拨打六次line,而不是一次拨打multi_line

此外,如果您对x范围使用字符串(即分类)坐标,则需要明确将唯一坐标列表作为x_range参数传递给plot。分类坐标没有固有的顺序,您必须指定所需的顺序。参见,例如

https://bokeh.pydata.org/en/latest/docs/user_guide/plotting.html#categorical-axes