使用bokeh绘制堆积的条形图

问题描述

我试图通过遵循文档的this部分来使用bokeh绘制堆积的条形图。 但是我的数据框要复杂一些。看起来像这样:

   events    count     Name
    a          2       jerry
    b          1       jerry
    a          8       joe
    c          1       joe 
    b          4       megan
    c          1       megan 
   ...        ...       ...

data.user.nunique() = 11(将在列中)并且data.event.nunique() = 167(将是每一列的堆叠段。请注意,并非每个用户都引发了所有唯一事件

因此根据文档中的代码以及数据框的上述部分:

output_file("stacked.html")
names = data.Name.unique()          # ['jerry','joe','megan']
events = data.events.unique()       # ['a','b','c']
colors =["#c9d9d3","#718dbf","#e84d60"]        

data = {'names' : names,'a'   : [2,8,0],# a raised 2 times by jerry,8 times by joe,0 times by megan
        'b'   : [1,4],'c'   : [0,1,1]}  

我的问题是双重的,1)如何从实际数据集中创建data字典? 2)是否有解决此问题的替代方法

解决方法

bokeh不一定需要使用字典,因此我们实际上可以使用pivot Dataframe方法来实现所需的变换并直接绘制结果。

>>> df = pd.DataFrame({
    'events': ['a','b','a','c','c'],'count': [2,1,8,4,1],'Name': ['jerry','jerry','joe','megan','megan']})

>>> df
  events  count   Name
0  a      2      jerry
1  b      1      jerry
2  a      8      joe  
3  c      1      joe  
4  b      4      megan
5  c      1      megan

转换数据:

>>> df2 = df.pivot(index="Name",columns="events",values="count").fillna(0)
>>> df2
events  a   b   c
Name            
jerry   2.0 1.0 0.0
joe     8.0 0.0 1.0
megan   0.0 4.0 1.0

绘制数据:

from bokeh.plotting import figure
from bokeh.palettes import viridis

names = df2.index.tolist()
events = df2.columns.tolist()
color = viridis(len(events))

p = figure(x_range=names)
p.vbar_stack(events,x="Name",source=df2,width=.9,color=color),legend_label=events)
show(p)

enter image description here

另一种绘制方法是使用holoviews库(简单地添加它是因为holoviews可以产生比bokeh更简洁的代码)。 Holoviews会为您处理数据转换,因此您无需付出任何额外的努力:

import holoviews as hv
hv.extension("bokeh")

hv.Bars(df,kdims=["Name","events"],vdims="count").opts(stacked=True)

enter image description here

对于替代解决方案,我不确定。我看不到对167种事件进行视觉比较是很容易的(这是167种独特的颜色,因此这些颜色可能不太容易辨别-更不用说一个包含167个条目的无用的图例了)。如果这种可视化方法无济于事,我建议您使用Holoviews库为您的每个名称创建一个条形图。然后,您可以为数据中的每个人切换图表。

import holoviews as hv
hv.extension("bokeh")

hv.Bars(df,vdims="count").groupby("Name")

1

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...