如何计算 labels/tooltips 的聚合的聚合?

How do I compute aggregates of aggregates for labels/tooltips?

如果我有聚合的时间序列数据。是否可以执行额外的聚合并将其显示在工具提示中?

这是我的问题的一个更明确的例子。对于下面的代码示例,我们显示了三种不同类型水果按月汇总的权重总和。是否也可以将每个月的总重量(and/or 可能是每个月水果重量的标准化百分比)显示为标签或工具提示?

我玩过 transform_aggregate,但似乎无法让它工作(它最终破坏了 group by 的水果)。 :(

dates = np.array([
     np.datetime64('200%s-%.02d-%.02d' % (i,j,k)) 
                   for i in range(5) 
                   for j in range(1,13) 
                   for k in range(1, 29)])
data = pd.DataFrame({
    'timestamp': dates,
    'weight': np.random.randint(0, 20, 1680),
    'fruit': np.random.randint(0,3, 1680)
})
date_month = alt.X('yearmonth(timestamp):O', title='Month')
total = alt.Y('weight:Q', aggregate='sum', title='Metric')

(alt.Chart(data).mark_bar().encode(
    x=date_month,
    y=total,
    color='fruit',
    tooltip=[date_month, total, 'fruit']
))

执行此操作的方法是使用聚合转换,尽管这有点棘手,因为您需要确保在计算聚合之前正确分组数据。以下是如何使用聚合转换而不是编码内的聚合来重现图表:

alt.Chart(data).transform_timeunit(
    Month='yearmonth(timestamp)'
).transform_aggregate(
    Metric='sum(weight)',
    groupby=['fruit', 'Month']
).mark_bar().encode(
    x='yearmonth(Month):O',  # use yearmonth to control axis format
    y='Metric:Q',
    color='fruit:Q',
    tooltip=['yearmonth(Month):O', 'Metric:Q', 'fruit:Q']
)

完成后,您可以使用类似的策略(密切跟踪 groupby)在每个柱上方显示总数:

base = alt.Chart(data).transform_timeunit(
    Month='yearmonth(timestamp)'
).encode(
    x='yearmonth(Month):O'
)

labels = base.transform_aggregate(
    Total='sum(weight)',
    groupby=['Month']
).mark_text().encode(
    y='Total:Q',
    text='Total:Q'
)

bars = base.transform_aggregate(
    Metric='sum(weight)',
    groupby=['fruit', 'Month']
).mark_bar().encode(
    y='Metric:Q',
    color='fruit:Q',
    tooltip=['Month:O', 'Metric:Q', 'fruit:Q']
)

alt.layer(bars, labels, width=1400)