0

我正在尝试按照文档的这一部分使用散景绘制堆积条形图。但我的数据框有点复杂。它看起来像这样:

   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, 0, 4],
        'c'   : [0, 1, 1]}  

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

4

1 回答 1

2

bokeh 不一定需要字典才能工作,所以我们实际上可以只使用pivotDataframe 方法来实现所需的转换并直接绘制结果。

>>> df = pd.DataFrame({
    'events': ['a', 'b', 'a', 'c', 'b', 'c'],
    'count': [2, 1, 8, 1, 4, 1],
    'Name': ['jerry', 'jerry', 'joe', '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)

在此处输入图像描述

绘制它的另一种方法是使用 holoviews 库(只需添加它,因为 holoviews 可以产生比散景更简洁的代码)。Holoviews 会为您处理数据转换,因此您不需要任何额外的工作:

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

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

在此处输入图像描述

至于替代解决方案,我不完全确定。我无法看到 167 种事件的视觉比较非常容易(即 167 种独特的颜色,所以颜色可能不是非常容易辨别——更不用说一个有 167 个条目的笨拙图例了)。如果这种可视化方式没有帮助,我建议使用 Holoviews 库为您的每个名字创建一个条形图。然后,您可以切换数据中每个人的图。

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

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

1

于 2020-09-15T07:24:31.347 回答