Altair:如何根据线的最大值在小平面网格中设置不同的样式?

Altair: how can I style lines differently in a facet grid, based on their max value?

我正在尝试创建一个分面图来比较睡眠剥夺研究中受试者的反应时间。数据来自 sleepstudy 数据集,在 pydataset 包中可用。

通过使用 altair.condition,我可以为线条设置不同的样式。问题是我没有得到我想要的结果。我的目标是只用橙色突出显示至少一次超过 400 (ms) 的线,即下图中的主题 308、332 和 337。

我在下面的代码中使用的 alt.condition 似乎只测试了 df.Reaction Pandas 系列的第一个数据。

我正在使用 altair 4.0.1

import altair as alt
from pydataset import data

df = data('sleepstudy')

alt.Chart(df).mark_line().encode(
    x=alt.X('Days:O', title=''),
    y=alt.Y('Reaction:Q', title='', scale=alt.Scale(domain=(200, 450))),
    # How do I test for the condition: is max(reaction) > 400 ms at least once during the study?
    color=alt.condition(
        alt.datum['Reaction'] > 300,
        alt.value('orange'),
        alt.value('darkgray')
    ),
    facet=alt.Facet('Subject:O', columns=3, title=''),
).properties(
    title='Reaction times (ms) for sleep-deprived subjects over 10 days',
    width=200,
    height=100
)

您可以通过使用 joinaggregate transform 来计算每个窗格中的最大值,然后根据该最大值进行着色:

import altair as alt
from pydataset import data

df = data('sleepstudy')

alt.Chart(df).transform_joinaggregate(
    maxReaction='max(Reaction)',
    groupby=['Subject']
).mark_line().encode(
    x=alt.X('Days:O', title=''),
    y=alt.Y('Reaction:Q', title='', scale=alt.Scale(domain=(200, 450))),
    # How do I test for the condition: is max(reaction) > 400 ms at least once during the study?
    color=alt.condition(
        alt.datum['maxReaction'] > 400,
        alt.value('orange'),
        alt.value('darkgray')
    ),
    facet=alt.Facet('Subject:O', columns=3, title=''),
).properties(
    title='Reaction times (ms) for sleep-deprived subjects over 10 days',
    width=200,
    height=100
)