如何用bokeh将pandas dataframe可视化为堆叠条形图?

0 投票
1 回答
24 浏览
提问于 2025-04-13 17:12

我想用这个数据框来创建一个堆叠柱状图,x轴是每个独特的日期,而堆叠的柱子是从“provider”这一列下的每个数字值中提取的。

分组数据框

当我创建一个透视表时,具有相同名称的列会把数据合并在一起。如果我把“provider”作为新列来透视,这样就会生成5列和14行。问题是,bokeh的vbar_stack不接受不同的列和行。它要求列和行的数量必须相同。但是,我无法在不合并数据的情况下创建透视表。

我能否转换这些数据,并使用bokeh包来创建一个堆叠柱状图?

代码:

pivot_df = grouped_df.pivot_table(index=['date'], columns='provider', values='num_youths', aggfunc='first', fill_value=0)

pivot_df.reset_index(inplace=True)

source = ColumnDataSource(pivot_df)

providers = pivot_df.columns[1:]

# Create the figure
p = figure(x_range=pivot_df['date'].unique(), plot_height=350, title="Number of Youths Funded by Provider Each Month",
           toolbar_location=None, tools="")

# Add stacked bars to the figure
p.vbar_stack(stackers=providers, x='date', width=0.9, color=["blue", "red"], source=source,
             legend_label=providers)

错误信息:
ValueError: 广播的关键字参数序列的长度必须与堆叠器相同

1 个回答

0

你需要正确处理你的 pandas DataFrame。

Pandas

下面的例子展示了你数据的一个简单示例。我使用了 groupbyunstack,并设置了填充模式,这样如果某些组在每个日期没有值,就会自动填入零。

之后,我会去掉返回的 DataFrame 的多重索引。

import pandas as pd

df = pd.DataFrame({
    'date': ['Aug 23', 'Aug 23', 'Dec 23'],
    'provider': ['A', 'B', 'C'],
    'num_youths': [1, 3, 4]
    }
)
df

>>> df
     date provider  num_youths
0  Aug 23        A           1
1  Aug 23        B           3
2  Dec 23        C           4

# groupby and fill with zeor
stacked = df.groupby(['date','provider']).sum().unstack(fill_value=0)
>>> stacked 
         num_youths      
provider          A  B  C
date                     
Aug 23            1  3  0
Dec 23            0  0  4

# drop multi index for columns and index
stacked.columns = stacked.columns.droplevel()
provider = list(stacked.columns)
stacked = stacked.reset_index()

为了得到 bokeh 想要的数据,你需要用 to_dict 方法,并设置 orient="list"

data = stacked.to_dict(orient='list')

bokeh

数据格式已经正确,所以只需调用 figure()vbar_stack。这段代码大部分来自于文档中的 堆叠条形图示例

from bokeh.plotting import figure, show, output_notebook
from bokeh.palettes import HighContrast3
output_notebook()

p = figure(x_range=data['date'], height=250, 
           toolbar_location=None, tools="hover", tooltips="@date $name @$name")

p.vbar_stack(provider, x='date', width=0.9, color=HighContrast3, source=data,
             legend_label=provider)

show(p)

堆叠条形图

撰写回答