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

Altair图表下拉选择器切换年份无数据显示问题求助

问题排查与解决:Altair下拉选择器切换年份无数据显示

问题原因

  • 你的代码先执行transform_aggregate时仅按lineage分组统计数量,聚合后的数据集已丢失year字段。后续用year_selector过滤时,因数据中无year字段,切换到具体年份无法匹配任何数据,导致图表为空。
  • 选择“全部”(None)时,Altair选择器默认不执行过滤,因此聚合后的全量数据能正常显示。

解决方法

  1. 调整聚合逻辑:按year和lineage共同分组,确保聚合后数据保留year字段,支持年份过滤。
  2. 优化过滤条件:针对选择器的None选项添加判断逻辑,确保“全部”选项显示所有年份数据。
  3. 修正排名逻辑:按年份分组计算lineage的排名,保证每个年份都展示该年份内统计量top10的lineage。

修改后的代码

year_dropdown = alt.binding_select(
    options = [None] + list(africa_metadata.year.unique()),
    labels = ["All"] + list(africa_metadata.year.unique()),
    name="Année:"
)

year_selector = alt.selection_point(
    fields=['year'],
    bind=year_dropdown,
    name="year_selection",
    value=None  # 默认选中全部
)

(
    alt.Chart(africa_metadata)
    # 按年份和谱系共同分组统计数量
    .transform_aggregate(
        count='count()',
        groupby=['year', 'lineage']
    )
    # 按年份内的统计量排名,取各年份top10
    .transform_window(
        rank_lineage="rank(count)",
        sort=[alt.SortField("count", order="descending")],
        groupby=['year']
    )
    .add_params(year_selector)
    # 过滤逻辑:选中全部则显示所有数据,否则匹配对应年份
    .transform_filter(
        alt.expr.isnull(year_selector.year) | (alt.datum.year == year_selector.year)
    )
    .transform_filter(
        'datum.rank_lineage<=10'
    )
    .mark_bar()
    .encode(
        alt.X('lineage:N', sort=alt.EncodingSortField(op='count', order='descending')),
        alt.Y('count:Q'),
        alt.Color("lineage:N")
    )
)

补充说明

  • 若希望“全部”选项展示所有年份合并后的top10 lineage(而非各年份单独的top10),需额外添加条件分支逻辑,或通过参数控制聚合方式。当前代码逻辑更贴合“按年份单独展示特征统计”的需求。
  • 确认数据集的year字段为数值类型(从你的数据片段看是整数,符合要求),若为字符串类型需调整匹配逻辑。

内容的提问来源于stack exchange,提问作者LostSmoksby

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 12:02:20