Я визуализирую набор данных, который имеет, например, категориальное поле и временное поле. Я хочу создать ленточную диаграмму, которая показывает временное распределение различных категорий, отсортированных в «возрастающем» / «убывающем» порядке в зависимости от их количества элементов. Этого можно просто достичь с помощью altair
:
import pandas as pd
import altair as alt
data = {0:{'Name':'Mary', 'Sport':'Tennis', 'competition':'2018/06/01'},
1:{'Name':'Cal', 'Sport':'Tennis','competition':'2018/06/05'},
2:{'Name':'John', 'Sport':'Tennis','competition':'2018/05/28'},
3:{'Name':'Jane', 'Sport':'Tennis','competition':'2018/05/20'},
4:{'Name':'Bob', 'Sport':'Golf','competition':'2018/03/01'},
5:{'Name':'Jerry', 'Sport':'Golf','competition':'2018/03/03'},
6:{'Name':'Gustavo', 'Sport':'Golf','competition':'2018/02/28'},
7:{'Name':'Walter', 'Sport':'Swimming','competition':'2018/01/01'},
8:{'Name':'Jessy', 'Sport':'Swimming','competition':'2018/01/03'},
9:{'Name':'Patric', 'Sport':'Running','competition':'2018/02/01'},
10:{'Name':'John', 'Sport':'Shooting','competition':'2018/04/01'}}
df = pd.DataFrame(data).T
alt.Chart(df).mark_tick().encode(
x='yearmonthdate(competition):T',
y=alt.Y('Sport:N',
sort=alt.SortField(field='count(Sport:N)', order='ascending', op='sum')
),
)
Теперь предположим, что меня интересуют только первые три самые многочисленные категории. Следуя принятому решению для "Altair / Гистограмма Vega-Lite: отфильтруйте верхние K столбцов из агрегированного поля ", на этот раз график не отображается:
alt.Chart(df).mark_tick().encode(
x='yearmonthdate(competition):T',
y=alt.Y('Sport:N',
sort=alt.SortField(field='count', order='ascending', op='sum')
),
).transform_aggregate(
count='count()',
groupby=['Sport']
).transform_window(
window=[{'op': 'rank', 'as': 'rank'}],
sort=[{'field': 'count', 'order': 'descending'}]
).transform_filter('datum.rank <= 3')
Обратите внимание, что даже порядок y-меток не соответствует ожидаемому.