如何用bokeh将pandas dataframe可视化为堆叠条形图?
我想用这个数据框来创建一个堆叠柱状图,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
下面的例子展示了你数据的一个简单示例。我使用了 groupby
和 unstack
,并设置了填充模式,这样如果某些组在每个日期没有值,就会自动填入零。
之后,我会去掉返回的 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)