如何使用Altair绘制带百分比的堆叠柱状图(时间序列数据场景)
解决Altair堆叠柱状图中百分比计算错误的问题
你离正确结果只差一步啦!问题出在transform_joinaggregate的分组逻辑上——你没有指定按type和date分组统计ID数量,导致计算的是整个数据集的ID总数,自然得不到预期的占比。
修正思路
我们需要分三步处理数据:
- 按**日期(date)和类型(type)**分组,统计每个组合下的ID数量;
- 按**类型(type)**获取对应的
total值(同类型的total是一致的); - 计算每组的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
相关产品推荐
相关产品推荐

