Altair / Vega-Lite条形图:从聚合场中过滤顶部K条

时间:2018-06-14 10:43:23

标签: python vega vega-lite altair

我可视化具有例如分类字段的数据集。我想创建一个条形图,显示该字段的不同类别及其基数,按照" ascendind' /'降序'排序。订购。这可以通过const sessionClient = new dialogflow.SessionsClient({ keyFilename: "relative/path/to/key.json" })

来实现
altair

Bar chart (full)

现在假设我只对前三个类别感兴趣。使用" transform_window"似乎是合理的。和“transform_filter”来过滤数据,但我无法找到这样做的方法。我也去Vega-Lite Top K example尝试调整它但没有成功(我的"最佳"尝试如下所示)。

import pandas as pd
import altair as alt

data = {0:{'Name':'Mary', 'Sport':'Tennis'},
    1:{'Name':'Cal', 'Sport':'Tennis'},
    2:{'Name':'John', 'Sport':'Tennis'},
    3:{'Name':'Jane', 'Sport':'Tennis'},
    4:{'Name':'Bob', 'Sport':'Golf'},
    5:{'Name':'Jerry', 'Sport':'Golf'},
    6:{'Name':'Gustavo', 'Sport':'Golf'},
    7:{'Name':'Walter', 'Sport':'Swimming'},
    8:{'Name':'Jessy', 'Sport':'Swimming'},
    9:{'Name':'Patric', 'Sport':'Running'},
    10:{'Name':'John', 'Sport':'Shooting'}}

df = pd.DataFrame(data).T

bars = alt.Chart(df).mark_bar().encode(
    x=alt.X('count():Q', axis=alt.Axis(format='.0d', tickCount=4)),
    y=alt.Y('Sport:N', 
        sort=alt.SortField(op='count', field='Sport:N', order='descending'))
)
bars

1 个答案:

答案 0 :(得分:2)

我可能会首先使用聚合变换来计算每个组中的人数,然后沿着你链接到的前K个例子的行继续。

signals.py

enter image description here

请注意,在Altair 2.2版本中(因为我写这篇文章时尚未发布),ready()将被重命名为alt.Chart(df).mark_bar().encode( x='count:Q', y=alt.Y('Sport:N', sort=alt.SortField(field='count', order='descending', 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') ,因为底层的Vega-Lite架构发生了变化。

(旁注:用于排序和窗口转换的altair API目前非常笨重,但我们正在努力思考如何改进它)