如果我有汇总的时间序列数据。是否可以执行其他聚合并将其显示在工具提示中?
这是我问题的一个更明确的例子。对于下面的代码示例,我们显示了三种不同类型的水果按月汇总的权重总和。是否还可以在标签上或工具提示中显示每个月的总重量(和/或每个月水果的重量的标准化百分比)?
我玩过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']
))
答案 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']
)
完成此操作后,可以使用类似的策略(密切跟踪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)