使用散景绘制堆积条形图
plot stacked bar chart using bokeh
我正在尝试按照文档的 this 部分使用散景绘制堆叠条形图。
但我的数据框有点复杂。它看起来像这样:
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)有没有其他方法可以解决这个问题?
bokeh 不一定需要字典来工作,所以我们实际上可以只使用 pivot
Dataframe 方法来实现所需的转换并直接绘制结果。
>>> 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 可以生成一些比 bokeh 更简洁的代码)。 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")
我正在尝试按照文档的 this 部分使用散景绘制堆叠条形图。 但我的数据框有点复杂。它看起来像这样:
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)有没有其他方法可以解决这个问题?
bokeh 不一定需要字典来工作,所以我们实际上可以只使用 pivot
Dataframe 方法来实现所需的转换并直接绘制结果。
>>> 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 可以生成一些比 bokeh 更简洁的代码)。 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")