如何计算标签/工具提示的汇总?

时间:2019-01-25 00:03:31

标签: python vega-lite altair

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

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

我玩过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']
))

1 个答案:

答案 0 :(得分:3)

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

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']
)

enter image description here

完成此操作后,可以使用类似的策略(密切跟踪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)

enter image description here