我正在将我的所有系统从Bokeh 0.9更新到Bokeh 0.11,并且有一张我似乎无法继续工作的图表。
我从这样的DataFrame开始:
Out[75]:
First Second Third Fourth Fifth
Red 27 22 33 20 9
Blue 10 27 18 31 14
Magenta 32 10 11 8 10
Yellow 8 6 14 13 15
Green 9 5 6 6 2
我会生成一个漂亮的图表,沿着轴有颜色名称,5个堆叠的条形图与图例的顺序相同,这将给出排名。例如,这是我们在0.9.0中生成10个等级和10个类别的堆积条的输出:
Stacked Bar with 10 categories and 10 ranks
我曾经这样做过:
plot = Bar(dataframe, list_of_color_names, title="stack of 5 categorical ranked in order from first to last", stacked=True, legend="top_right", ylabel="count", width=600, height=600)
其中“list_of_colors_names”只是从DataFrame的索引生成的列表,但这不再起作用。我意识到0.11滴“堆叠=真”并且现在我们使用“堆栈”,但我似乎仍然无法让它工作。
Bokeh网站上的示例是为了更简单的条形图,当我将该模型应用于我的DataFrame时,我得到了各种错误,例如“'NoneType'对象不可迭代”,但我显然只是错过了关于这种堆叠条如何在0.11中工作的更大图片。这里还有一些其他Bokeh堆叠条形讨论,但它们要么是早期版本的Bokeh(我的代码工作在0.9),要么似乎是一个不同的情况。现在做这种堆叠酒吧最好的方法是什么?
答案 0 :(得分:2)
我不知道这是否是唯一的方法,但如果您将所有数据放在列中而不是矩阵中,则Bokeh 0.11中的堆积条形图可以正常工作。然后,您需要在相应的数据帧列中提供矩阵行和列索引,在下面的示例代码中称为nr
和rank
。调用Bar方法时会引用它们,其中“stack”应引用矩阵示例中的列。
import pandas as pd
from bokeh.charts import Bar, show
all_data={
'nr': [1,2,3,4,5,
1,2,3,4,5,
1,2,3,4,5,
1,2,3,4,5,
1,2,3,4,5],
'rank':['First','First','First','First','First',
'Second','Second','Second','Second','Second',
'Third','Third','Third','Third','Third',
'Fourth','Fourth','Fourth','Fourth','Fourth',
'Fifth','Fifth','Fifth','Fifth','Fifth'],
'data':[27,10,32,8,9,
22,27,10,6,5,
33,18,11,14,6,
20,31,8,16,6,
9,14,10,15,2]
}
df=pd.DataFrame(all_data)
p=Bar(df,label='nr',values='data',stack='rank',legend='top_right')
show(p)
评论:标准条形图调色板只有六种颜色,如10级排名示例所示。我使用下面的代码片段,改编自其他代码片段,以生成条形图所需的尽可能多的不同颜色。它使用matplotlib色彩映射色图作为输入。
import matplotlib.cm as cm
import numpy as np
colormap =cm.get_cmap("jet")
different_colors=10
color_mapping=colormap(np.linspace(0,1,different_colors),1,True)
bokeh_palette=["#%02x%02x%02x" % (r, g, b) for r, g, b in color_mapping[:,0:3]]
p=Bar(df,label='nr',values='data',stack='rank',legend='top_right',palette=bokeh_palette)
show(p)
这是一个很好的页面,讨论如何选择matplotlib colormaps。