Plotly下拉菜单疫苗接种数据图表仅显示单个厂商数据的问题问询
解决Plotly下拉菜单切换地区时无法显示所有疫苗厂商数据的问题
我刚看完你的问题,核心问题出在你处理Plotly Express生成的trace的方式上——当你用color="nome_fabricante_vacina"参数分组时,Plotly会为每个疫苗厂商生成独立的trace,但你的代码只取了每个地区的第一个trace(data[0]),这就导致切换下拉菜单时只能看到一家厂商的数据。
问题根源拆解
在你的循环里,px.histogram(...)会根据nome_fabricante_vacina的不同值生成多个trace(比如有4家厂商就生成4个trace),但你用.data[0]只提取了第一个trace,自然只能显示一家厂商的数据。同时,你构建的visible数组长度是地区的数量,而实际需要对应所有trace的总数,这也会导致显示逻辑混乱。
修改后的完整代码
import plotly.express as px import plotly.graph_objects as go # 假设dfs1是你按地区分组后的列表,每个元素是(地区名称, 对应DataFrame) first_title = dfs1[0][0] traces = [] buttons = [] total_traces = 0 # 第一步:先收集所有地区的所有trace,并记录每个地区对应的trace索引范围 region_trace_ranges = [] for d in dfs1: region_name = d[0] df_region = d[1].query('dose_vacina == "2ª Dose"') # 生成当前地区的所有厂商trace fig_region = px.histogram(df_region, x = "data_aplicacao_vacina", y = "total_doses", color = "nome_fabricante_vacina", color_discrete_map={"AstraZeneca": "#00CC96", "Coronavac": "#EF553B", "Pfizer": "#AB63FA", "Janssen": "#F9C023"}, nbins=52, hover_name="nome_fabricante_vacina", hover_data=["nome_fabricante_vacina"] ) # 将当前地区的所有trace添加到总列表 traces.extend(fig_region.data) # 记录当前地区的trace起始和结束索引 region_trace_ranges.append((total_traces, total_traces + len(fig_region.data))) total_traces += len(fig_region.data) # 第二步:构建下拉菜单的buttons for i, (region_name, (start_idx, end_idx)) in enumerate(zip([d[0] for d in dfs1], region_trace_ranges)): # 初始化所有trace为隐藏 visible = [False] * total_traces # 将当前地区的所有trace设为显示 for idx in range(start_idx, end_idx): visible[idx] = True # 添加按钮 buttons.append(dict( label=region_name, method="update", args=[ {"visible": visible}, {"title": f"{region_name} - 2ª Dose疫苗接种数据"} ] )) # 第三步:创建图表并设置初始状态 updatemenus = [{'active': 0, "buttons": buttons}] fig = go.Figure(data=traces, layout=dict(updatemenus=updatemenus)) # 初始状态显示第一个地区的所有trace fig.update_layout(title=f"{first_title} - 2ª Dose疫苗接种数据", title_x=0.5) fig.show()
关键修改点说明
- 收集所有trace:用
traces.extend(fig_region.data)替代之前的append(..., data[0]),把每个地区的所有厂商trace都加入总列表。 - 跟踪trace索引范围:用
region_trace_ranges记录每个地区对应的trace在总列表中的起始和结束位置,这样切换下拉菜单时能精准控制哪些trace显示。 - 修正visible数组:现在
visible数组的长度等于所有trace的总数,切换地区时只把该地区对应的所有trace设为True,其余设为False。 - 初始状态设置:确保初始状态下第一个地区的所有trace都是显示的,和下拉菜单的
active=0对应。
这样修改后,你切换下拉菜单的不同地区时,就能看到该地区所有疫苗厂商的接种数据条形图了,和不带下拉菜单时的显示效果一致。
内容的提问来源于stack exchange,提问作者Lucas Thaynan
相关产品推荐
相关产品推荐

