You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 09:39:10