Python中实现可按item取值筛选的Plotly直方图问题
Python中实现可按item取值筛选的Plotly直方图问题
我看你想要做一个能按item的不同取值(A、B、C、D)筛选,展示对应value分布的Plotly直方图,不过当前代码没达到预期效果,我来帮你梳理问题并修正~
原代码的问题分析
- 你原本的直方图把
dataset.item作为x轴,这其实是在统计每个item取值的出现次数,而不是每个item对应的value的分布,和你的需求不符。 - 按钮逻辑错误:你循环的是
continuous_vars(仅包含"item"列名),所以只生成了一个无效按钮,而且没有按item取值筛选对应的value数据。
修正后的代码
import pandas as pd import plotly.graph_objects as go dataset = pd.DataFrame( {'item': ['A', 'A', 'B', 'C', 'D', 'A', 'A', 'B', 'C', 'D', 'A', 'A', 'B', 'C', 'D'], 'value': [27, 33, 3, 26, 8, 27, 3, 13, 16, 2, 27, 17, 12, 6, 28], } ) # 获取item的所有唯一取值,作为筛选选项 item_options = dataset['item'].unique().tolist() fig = go.Figure() # 初始显示第一个item(A)对应的value分布直方图 initial_item = item_options[0] fig.add_trace( go.Histogram( x=dataset[dataset['item'] == initial_item]['value'], xbins=go.histogram.XBins(size=5), # 自定义分箱大小 marker=go.histogram.Marker(color="orange"), # 自定义颜色 ) ) # 生成每个item对应的筛选按钮 buttons = [] for item_val in item_options: buttons.append( dict( method='restyle', label=item_val, # 按钮显示item的取值(A/B/C/D) args=[ {"x": [dataset[dataset['item'] == item_val]['value']]}, # 更新x轴为对应item的value数据 [0] # 指定更新第一个trace ] ) ) # 配置下拉菜单 updatemenu = [ dict( buttons=buttons, direction='down', showactive=True, active=0 # 默认选中第一个按钮(对应初始显示的item) ) ] fig.update_layout( showlegend=False, updatemenus=updatemenu, title="按Item筛选的Value分布直方图", xaxis_title="Value", yaxis_title="频数" ) fig.show()
关键改动说明
- 目标数据调整:把直方图的x轴从
item列改成了对应item取值的value数据,这才是你需要的分布统计。 - 按钮逻辑修正:遍历item的所有唯一取值生成按钮,每个按钮点击后会筛选出对应item的value数据并更新直方图。
- 初始状态优化:默认显示第一个item(A)的value分布,下拉菜单默认选中对应按钮,交互更直观。
备注:内容来源于stack exchange,提问作者jonboy
相关产品推荐
相关产品推荐

