你好,我有以下数据:
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中的变化情况。如下所示。
因此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
有人可以帮我解决这个问题吗?
答案 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