如何转换Pandas DataFrame并解决Bokeh堆叠柱状图报错问题?
解决Bokeh vbar_stack的ValueError问题
错误原因
你遇到的ValueError核心原因是:vbar_stack方法要求color、legend_label这类序列型参数的长度,必须和stackers参数的长度完全一致。你的代码中providers是5个(透视表生成的5个provider列),但color只传了2个颜色,长度不匹配导致广播失败。
解决方案
只需让color和legend_label的长度与stackers(即providers)的长度保持一致即可,推荐用Bokeh内置调色板快速生成对应长度的颜色列表:
修改后的完整代码
# 导入需要的模块 from bokeh.palettes import Spectral5 from bokeh.models import ColumnDataSource from bokeh.plotting import figure # 透视表逻辑保持不变 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:] # 创建图表,x_range直接用去重后的date列即可 p = figure(x_range=pivot_df['date'], plot_height=350, title="每月各资助方帮扶青年人数", toolbar_location=None, tools="") # 使用与providers长度匹配的调色板(Spectral5对应5个provider) p.vbar_stack(stackers=providers, x='date', width=0.9, color=Spectral5, source=source, legend_label=providers) # 可选:调整图例位置提升可读性 p.legend.location = "top_left"
手动定义颜色的替代方案
如果不想用内置调色板,也可以手动定义和providers长度一致的颜色列表:
colors = ["blue", "red", "green", "orange", "purple"] # 5个颜色对应5个provider p.vbar_stack(stackers=providers, x='date', width=0.9, color=colors, source=source, legend_label=providers)
内容的提问来源于stack exchange,提问作者coconutgo
相关产品推荐
相关产品推荐

