首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >牛尾:有序面的极限数

牛尾:有序面的极限数
EN

Stack Overflow用户
提问于 2022-08-26 09:08:50
回答 1查看 41关注 0票数 1

此示例代码显示了6个方面,按它们的方式排序。我如何才能只显示两个顶部或底部的面,这些面是这样排序的?我尝试玩transform_window排名选项,没有运气,它限制了所有方面的酒吧内容。

代码语言:javascript
复制
import altair as alt
from vega_datasets import data

source = data.barley()

alt.Chart(source).mark_bar().encode(
    x='yield:Q',
    y='year:O',
    color='year:N',
    facet=alt.Facet('site',
        sort={
            'field': 'yield',
            'op': 'mean',
            'order': 'descending'
        },
        columns=1
    )
)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-28 20:37:28

您可以使用一个联合聚合转换来计算站点平均值,然后使用窗口转换对它们进行排序,最后使用filter transform (类似于文档中的示例)过滤级别:

代码语言:javascript
复制
import altair as alt
from vega_datasets import data


source = data.barley()

n_top_sites = 3

alt.Chart(source).mark_bar().encode(
    x='mean_yield_per_site:Q',
    y='year:O',
    color='year:N',
).facet(
    alt.Facet('site', sort=['mean_yield_per_site'], title=''),
    columns=1,
).transform_joinaggregate(
    mean_yield_per_site='mean(yield)',
    groupby=['site']
).transform_window(
    rank='dense_rank()',  # Don't skip any rank numbers, https://vega.github.io/vega-lite/docs/window.html#ops
    sort=[alt.SortField('mean_yield_per_site', order='descending')]
).transform_filter(
    f'datum.rank <= {n_top_sites}'
)

同样的结果可以通过计算大熊猫的顶级站点索引标签,然后通过altair的过滤器转换过滤成为该列表中的成员来实现:

代码语言:javascript
复制
n_top_sites = 2
top_sites = source.groupby('site').mean()['yield'].nlargest(n_top_sites).index.tolist()

alt.Chart(source).mark_bar().encode(
    x='yield:Q',
    y='year:O',
    color='year:N',
    facet=alt.Facet('site',
        sort={
            'field': 'yield',
            'op': 'mean',
            'order': 'descending'
        },
        columns=1
    )
).transform_filter(
    f'indexof({top_sites}, datum.site) != -1'
)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73498643

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档