此示例代码显示了6个方面,按它们的方式排序。我如何才能只显示两个顶部或底部的面,这些面是这样排序的?我尝试玩transform_window排名选项,没有运气,它限制了所有方面的酒吧内容。
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
)
)发布于 2022-08-28 20:37:28
您可以使用一个联合聚合转换来计算站点平均值,然后使用窗口转换对它们进行排序,最后使用filter transform (类似于文档中的示例)过滤级别:
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的过滤器转换过滤成为该列表中的成员来实现:
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'
)https://stackoverflow.com/questions/73498643
复制相似问题