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

如何使用Altair绘制带百分比的堆叠柱状图(时间序列数据场景)

解决Altair堆叠柱状图中百分比计算错误的问题

你离正确结果只差一步啦!问题出在transform_joinaggregate的分组逻辑上——你没有指定按type和date分组统计ID数量,导致计算的是整个数据集的ID总数,自然得不到预期的占比。

修正思路

我们需要分三步处理数据:

  1. 按**日期(date)和类型(type)**分组,统计每个组合下的ID数量;
  2. 按**类型(type)**获取对应的total值(同类型的total是一致的);
  3. 计算每组的ID数量与对应total的比值。

修正后的代码

import altair as alt
import pandas as pd

df = pd.DataFrame({
    'date': ['2020-04-08','2020-04-08','2020-04-08','2020-04-23','2020-04-23','2020-04-23','2020-04-08','2020-04-08','2020-04-23','2020-04-23','2020-04-28'],
    'type': ['h','h','h','h','h','h','s','s','s','s','s'],
    'ID': ['a','b','c', 'a','e','f', 'a','e','a','c','d'],
    'total': [5,5,5,5,5,5,4,4,4,4,4]
})

alt.Chart(df).transform_aggregate(
    count_id='count(ID)',  # 按date和type分组统计ID数量
    groupby=['date', 'type']
).transform_joinaggregate(
    total_val='max(total)',  # 按type分组取对应total(同type的total一致,max/min/mean都可)
    groupby=['type']
).transform_calculate(
    Prc='datum.count_id / datum.total_val'  # 计算占比
).mark_bar().encode(
    alt.X('monthdate(date):T', title='日期'),
    y=alt.Y('Prc:Q', title='占比', axis=alt.Axis(format='%')),  # 自动转换为百分比显示
    color=alt.Color('type:N', title='类型')
).properties(
    title='按日期和类型统计的ID占比堆叠柱状图'
)

结果验证

针对你提到的2020-04-08日期:

  • 类型h的ID数量是3,对应total是5,占比3/5=0.6(60%);
  • 类型s的ID数量是2,对应total是4,占比2/4=0.5(50%);
    完全符合你的预期结果。

关键说明

  • transform_aggregate用于按date和type分组统计ID计数,确保我们得到的是每个日期下各类型的实际ID数量;
  • transform_joinaggregate按type分组提取total值,因为你的数据中同类型的total是固定值,用max/min/mean都能正确获取;
  • Y轴设置format='%'可以将小数自动转换为百分比格式,让图表更直观。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 18:27:43