1 回答

TA貢獻1845條經驗 獲得超8個贊
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 可以生成一些比 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")
添加回答
舉報