Streamlit+Plotly调用groupby绘制柱状图报参数长度不匹配错误
报错根因
错误触发逻辑非常明确:
- Plotly Express 所有数据映射类参数(
x/y/color等)仅支持传入单个列名的字符串,或者和数据行数等长的序列值,不支持直接传入列名列表。 - 原代码直接将多选组件返回的列表
multiselect_var传给color参数:当选中3个选项时,传入值是长度为3的列名列表,和聚合后数据框95行的长度完全不匹配,直接触发长度校验的ValueError。 - 存在隐性逻辑问题:代码已经提前用
groupby完成了计数聚合,不需要使用px.histogram(该接口默认会对原始数据做自动计数聚合,和提前计算好的count列逻辑冲突),换用px.bar绘制聚合后的柱状图逻辑更通顺。
修复方案
核心处理逻辑:当多选组件选中N个分组列时,不能直接把列列表传给color,需要将多个分组列的取值拼接为单一组合分类列,再传给color参数做分色,同时补充空选择的边界判断。
修复后可运行代码如下:
some_columns_df = df.loc[:,['gender','country','city','hoby','company','status']] # 修正原代码中collumns的拼写错误,避免隐性变量名bug some_columns = some_columns_df.columns.tolist() select_box_var = st.selectbox("Choose X Column", some_columns) multiselect_var = st.multiselect("Select Columns To GroupBy", some_columns) if not multiselect_var: # 未选择任何分组列的场景 plot_df = df.groupby(select_box_var).size().reset_index(name='count') fig = px.bar( plot_df, x=select_box_var, y='count', barmode='group', text_auto=True ) else: group_cols = [select_box_var] + multiselect_var plot_df = df.groupby(group_cols).size().reset_index(name='count') # 多分组列拼接为单一分类列 if len(multiselect_var) > 1: plot_df['group_category'] = plot_df[multiselect_var].apply( lambda row: ' | '.join(row.astype(str)), axis=1 ) color_arg = 'group_category' else: color_arg = multiselect_var[0] fig = px.bar( plot_df, x=select_box_var, y='count', color=color_arg, barmode='group', text_auto=True ) st.plotly_chart(fig)
补充说明
如果不需要把多个分组维度合并到同一个图例里分色,也可以将多列传给facet_col/facet_row参数绘制分面子图,但是color参数本身不支持传入多列,必须处理为单列分类值才能正常运行。
内容的提问来源于stack exchange,提问作者DevLeb2022
相关产品推荐
相关产品推荐

