Altair:带有图例和自定义颜色的分层折线图

Altair: Layered Line Chart with Legend and Custom Colors

我正在 Altair 中创建一个包含 2 条线的分层折线图,每条线都有自定义颜色。我想为此添加一个图例。我的原始代码(没有图例)如下所示:

source = df

line1 = alt.Chart(source).mark_line().encode(
    x='Date:T', 
    y='FeatureOne:Q', 
    color= alt.value('gold')
)

line2 = alt.Chart(source).mark_line().encode(
    x='Date:T', 
    y=alt.Y('FeatureTwo:Q', title='Value'), 
    color= alt.value('red')
)

line1 + line2

这是可视化:

我想为此添加一个图例,幸运的是,之前有一个

但是,我想不通的是如何使用图例,同时还保留自定义颜色。我只能做一个或另一个。有没有办法做到这两点?例如,如果我遵循上面链接的答案中的代码,我的代码如下所示:

source = df

line1 = alt.Chart(source).mark_line().transform_fold(
    fold=['FeatureOne'], 
    as_=['variable', 'value']
).encode(
    x='Date:T', 
    y='FeatureOne:Q', 
#     color= alt.value('gold')
    color='variable:N'
)

line2 = alt.Chart(source).mark_line().transform_fold(
    fold=['FeatureTwo'], 
    as_=['variable', 'value']
).encode(
    x='Date:T', 
    y=alt.Y('FeatureTwo:Q', title='Value'), 
#     color= alt.value('red')
    color='variable:N'
)

line1 + line2

这给了我一个带图例的分层折线图,但我无法设置线条的颜色。所以它看起来有点像这样:

我该如何更改它,以便在第一个示例中获得自定义线条颜色:

color= alt.value('red')

同时做图例:

color='variable:N'

有没有什么好的方法可以同时做?

您可以像这样定义自定义色标:

scale = alt.Scale(domain=['FeatureOne', 'FeatureTwo'], range=['gold', 'red'])

然后将此比例传递给图表中的一种或两种颜色编码:

color=alt.Color('variable:N', scale=scale)

但请注意,如果您已经在使用折叠变换,则没有理由手动进行分层;这应该可以同时绘制两条线:

alt.Chart(source).mark_line().transform_fold(
    fold=['FeatureOne', 'FeatureTwo'], 
    as_=['variable', 'value']
).encode(
    x='Date:T', 
    y='value:Q',
    color=alt.Color('variable:N', scale=scale)
)