Streamlit中使用st.multiselect生成分组柱状图结果不符合预期求助
问题原因
- 你获取到
multiselect的选中客户列表options后,没有对原始数据集做过滤,代码里selections/offers/joinings三个变量取的还是全量数据的对应列,和你选中的客户没有绑定关联 - 当你选了n个客户时,x轴只有n个刻度,Plotly会默认取y轴全量数据的前n个值渲染,所以永远显示的是数据集最前面几行的数值,和你选中的客户完全不匹配
修复方案
先根据选中的options过滤原始数据,再取过滤后的数据生成图表即可,修正后的代码如下:
import streamlit as st import plotly.graph_objects as go import pandas as pd data = load_data() st.markdown('### Client Selection, Offers and Joinings') clients = data['Client'].to_list() options = st.multiselect('Client List', clients) st.write(data) # 按选中的客户过滤数据集 if options: filtered_data = data[data['Client'].isin(options)] # 按选中顺序排序,保证x轴展示顺序和选择顺序一致 filtered_data['Client'] = pd.Categorical(filtered_data['Client'], categories=options, ordered=True) filtered_data = filtered_data.sort_values('Client') else: # 未选择客户时默认展示全量数据,可根据需求调整逻辑 filtered_data = data selections = filtered_data['selections'] offers = filtered_data['offers'] joinings = filtered_data['joinings'] fig1 = go.Figure() fig1.add_trace(go.Bar( x=filtered_data['Client'], y=selections, name='Selections', marker_color='indianred' )) fig1.add_trace(go.Bar( x=filtered_data['Client'], y=offers, name='Offers', marker_color='lightsalmon' )) fig1.add_trace(go.Bar( x=filtered_data['Client'], y=joinings, name='Joinings', marker_color='indianred' )) fig1.update_layout(barmode='group', xaxis_tickangle=-45) st.plotly_chart(fig1)
内容的提问来源于stack exchange,提问作者ira bajpai
相关产品推荐
相关产品推荐

