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

如何用Pandas和Altair制作交互式图表?单数据行图表形态疑问

问题解析与优化建议

当前图表形态的原因

你的图表呈现当前样式,核心逻辑在于两层图表的编码方式:

  1. 基础灰色点层:使用mark_point()且未做任何分组或聚合,直接绘制了所有国家、所有年份的FactValueNumericHigh数据点。因为每个年份对应多个国家的数值,所以X轴上的每个年份位置都会堆叠多个灰色点,形成簇状效果。
  2. 橙色高亮折线层:通过transform_filter(country)筛选出选中国家的数据,再用mark_line()连接该国家各年份的数值点。由于每个国家在对应年份仅有一个数据点,因此能形成连贯的折线。

优化方案(可选)

如果想让图表视觉效果更清晰,可针对基础层做以下调整:

  • 添加透明度减少点重叠:给基础层的点设置低透明度,避免密集点堆在一起难以分辨:
    base = alt.Chart(df_cropped).mark_point().encode(
        alt.X("Period:O"),
        alt.Y("FactValueNumericHigh:Q"),
        color=alt.value('lightgray'),
        opacity=alt.value(0.2)  # 新增透明度参数
    )
    
  • 展示年份整体分布:用箱线图或误差带替代散点,呈现每个年份所有国家的数值分布特征:
    # 箱线图版本基础层
    base = alt.Chart(df_cropped).mark_boxplot().encode(
        alt.X("Period:O"),
        alt.Y("FactValueNumericHigh:Q"),
        color=alt.value('lightgray')
    )
    
  • 验证数据唯一性:确认数据集是否存在同一国家、同一年份的重复数据,可执行以下代码检查:
    print(df_cropped.duplicated(subset=["Location", "Period"]).any())
    

原实现代码与图表效果

原代码:

# 数据来源:WHO平均BMI数据集
df = pd.read_csv("obesity_WHO.csv")
df_cropped = df.loc[:, ["Location", "Period", "FactValueNumericHigh"]]
pd.options.display.max_colwidth = 200
print(df_cropped[df_cropped['Location'].str.contains("United")]['Location'])

# 按年份排序
df_cropped = df_cropped.sort_values("Period")

# 定义国家选择下拉框
country = alt.selection_single(
    name="Location",
    fields=["Location"],
    init={"Location": "United Kingdom of Great Britain and Northern Ireland"},
    bind=alt.binding_select(options=list(df_cropped['Location'].unique()))
)

# 基础层:所有国家的散点
base = alt.Chart(df_cropped).mark_point().encode(
    alt.X("Period:O"),
    alt.Y("FactValueNumericHigh:Q"),
    color=alt.value('lightgray')
)

# 高亮层:选中国家的折线
highlight = alt.Chart(df_cropped).mark_line().encode(
    alt.X("Period:O"),
    alt.Y("FactValueNumericHigh:Q"),
    color=alt.value('orange')
).transform_filter(
    country
).interactive()

# 合并图层
chart = alt.layer(base, highlight).add_selection(country)
chart.configure_view(fill="#fff").properties(width=600, height=300)

图表效果:
图表效果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 01:15:09