如何在Altair中提取分组变量最终值并绘制柱状图?
问题解决:Altair中正确展示累积求和的最终值柱状图
你的问题出在重复数据的默认聚合上:base数据集里每个class对应3条带cumulative值的记录,用transform_window生成final字段后,每个class的每条记录都会被赋值为该类的最终累积值(比如A类的3条记录的final都是8)。而Altair的柱状图默认会对Y轴数值做sum聚合,所以83=24,123=36,导致结果错误。
下面提供两种有效解决方法:
方法1:直接聚合最终值
跳过重复的中间记录,用transform_aggregate直接计算每个class的最终累积值:
df = pd.DataFrame({"time":[1,2,3,1,2,3], "value": [1,5,2,2,3,7], "class": ["A","A","A","B","B","B"]}) # 先计算累积值,再聚合每个class的最后一个累积值 base = alt.Chart(df).transform_window( cumulative = "sum(value)", groupby = ["class"], frame = [None, 0], ).transform_aggregate( final_cumulative = "last(cumulative)", groupby = ["class"] ) base.mark_bar().encode( x = "class:N", y = "final_cumulative:Q" )
方法2:筛选最后一条记录
在生成final字段后,筛选出每个class中time最大的那条记录,避免重复聚合:
df = pd.DataFrame({"time":[1,2,3,1,2,3], "value": [1,5,2,2,3,7], "class": ["A","A","A","B","B","B"]}) base = alt.Chart(df).transform_window( cumulative = "sum(value)", groupby = ["class"], frame = [None, 0], ).transform_window( final = "last_value(cumulative)", groupby = ["class"], sort = [alt.SortField(field = "time")], frame = [None, None], ).transform_filter( # 筛选每个class的最后一条time记录 alt.datum.time == alt.max(alt.datum.time, groupby=["class"]) ) base.mark_bar().encode( x = "class:N", y = "final:Q" )
两种方法都能得到A类8、B类12的正确柱状图结果。
内容的提问来源于stack exchange,提问作者Bert Coerver
相关产品推荐
相关产品推荐

