Способ сделать это с помощью агрегатных преобразований, хотя это немного сложнее, потому что вам нужно убедиться, что данные правильно сгруппированы, прежде чем вычислять агрегат.Вот как вы можете воспроизвести диаграмму, используя агрегированные преобразования, а не агрегаты в кодировке:
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)