Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Altair/Vega Lite条形图:从聚合字段中筛选顶部K条_Python_Vega_Vega Lite_Altair - Fatal编程技术网

Python Altair/Vega Lite条形图:从聚合字段中筛选顶部K条

Python Altair/Vega Lite条形图:从聚合字段中筛选顶部K条,python,vega,vega-lite,altair,Python,Vega,Vega Lite,Altair,我正在可视化一个数据集,例如,有一个分类字段。我想创建一个条形图,显示该字段的不同类别及其基数,按“升序”/“降序”顺序排序。这可以通过altair实现: import pandas as pd import altair as alt data = {0:{'Name':'Mary', 'Sport':'Tennis'}, 1:{'Name':'Cal', 'Sport':'Tennis'}, 2:{'Name':'John', 'Sport':'Tennis'},

我正在可视化一个数据集,例如,有一个分类字段。我想创建一个条形图,显示该字段的不同类别及其基数,按“升序”/“降序”顺序排序。这可以通过
altair
实现:

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

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


我可能会首先使用聚合变换来计算每个组中的人数,然后按照链接到的top-K示例进行操作

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')
alt.Chart(df).mark_bar().encode(
x='count:Q',
y=alt.y('运动:N',
sort=alt.SortField(field='count',order='descending',op='sum')
),
).转换集合(
count='count()',
groupby=['Sport']
).转换窗口(
window=[{'op':'rank','as':'rank'}],
排序=[{'field':'count','order':'descending'}]

).transform_filter('datum.rank我可能会首先使用聚合转换来计算每个组中的人数,然后按照链接到的top-K示例进行操作

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')
alt.Chart(df).mark_bar().encode(
x='count:Q',
y=alt.y('运动:N',
sort=alt.SortField(field='count',order='descending',op='sum')
),
).转换集合(
count='count()',
groupby=['Sport']
).转换窗口(
window=[{'op':'rank','as':'rank'}],
排序=[{'field':'count','order':'descending'}]

).transform_filter('datum.rank非常感谢@jakevdp的回答。正如我所说的,它解决了问题,但如果我们稍微更改数据集以包含“比赛日”字段(类型为临时字段),它将无效并将其用作条形图的x轴。您是否建议编辑该问题以包含此案例或创建一个新案例?继续问另一个问题,并提供详细信息-这将比编辑此问题更简洁。非常感谢@jakevdp的回答。它解决了我所述的问题,但如果我们稍微更改数据集,则无效要包含一个“竞赛日”字段(时间类型),并将其用作条形图的x轴。您是否建议编辑该问题以包含此案例或创建一个新的案例?继续问另一个问题,并提供详细信息-这将比编辑此问题更清晰。