有没有办法在 Altair 中 select 或突出显示最后或第一个 "n" 数据点?

Is there a way to select or highlight last or first "n" data points in Altair?

我最近发现想要的一件事是能够突出显示或 select Altair 中最后的 n 数据点。例如,对于每天更新的时间序列数据,selecting/highlighting 最近 7 天的数据 window.

condition 的问题是您必须明确指定 日期 或一个值,selection/highlight 就是从中发生的。这样做的一个缺点是,在时间序列数据更新相当频繁的情况下,它变成了一项手动任务。

一个可能的解决方案是只使用原生 Python 并且如果 x 轴是 datetime 数据,那么以编程方式处理代码可能使用 f-strings 的东西。

我想知道,尽管有上述两种解决方案,但是否有一种方法原生内置到 Altair/Vega-Lite 到 select last/first n 数据点?

一个使用 f-strings 的人为例子 -

index = 7 #a perhaps bad way to highlight last 2 data points
data = pd.DataFrame({'time':[0,1,2,3,4,5,6,7,8,9], 'value':[1,2,4,8,16,15,14,13,12,11]})

bar = alt.Chart(data).mark_bar(opacity=1, width=15).encode(
    x='time:T',
    y='value:Q',
    color = alt.condition(alt.datum.time>f'{index}', alt.value('red'), alt.value('steelblue'))
)

text = bar.mark_text(align='center', dy=-10).encode(
    text='value:Q'
)

bar+text

您可以使用 window 转换来执行此操作,方法类似于 Top-K Items 示例:

import altair as alt
import pandas as pd

data = pd.DataFrame({'time':[0,1,2,3,4,5,6,7,8,9], 'value':[1,2,4,8,16,15,14,13,12,11]})
num_items = 2

base = alt.Chart(data).transform_window(
    rank='rank()',
    sort=[alt.SortField('time', order='descending')]
)

bar = base.mark_bar(opacity=1, width=15).encode(
    x='time:T',
    y='value:Q',
    color = alt.condition(alt.datum.rank<=num_items, alt.value('red'), alt.value('steelblue'))
)

text = bar.mark_text(align='center', dy=-10).encode(
    text='value:Q'
)

bar+text