更改 Altair 图表上一条线的粗细

Change thickness of one line on Altair chart

我想生成多折线图并仅更改绘制的其中一条线的粗细。例如

from vega_datasets import data

source = data.stocks()

alt.Chart(source).mark_line().encode(
    x='date',
    y='price',
    color='symbol',
)

给出这张图表:

如何才能使 IBM 线的厚度是所有其他线的两倍?

谢谢

您可以使用条件 strokeWidth 编码来做到这一点:

from vega_datasets import data
import altair as alt

source = data.stocks()

alt.Chart(source).mark_line().encode(
    x='date',
    y='price',
    color='symbol',
    strokeWidth=alt.condition(
        "datum.symbol == 'IBM'",
        alt.value(4),
        alt.value(1))
)

API 看来,似乎没有直接的方法可以做到这一点(虽然不自信!)。但是,我认为有一些方法可以使用 transform_filter 来操纵数据流。

这是一个例子:

import pandas as pd
import numpy as np
import altair as alt

rand = np.random.RandomState(0)

data = pd.DataFrame({'value1': rand.randn(100).cumsum(),
                     'value2': rand.randn(100).cumsum()},
                    index=pd.date_range('2018', freq='D', periods=100))
data = data.reset_index()
data = data.melt(['index'])
data.head()

输出:

    index   variable    value
0   2018-01-01  value1  1.764052
1   2018-01-02  value1  2.164210
2   2018-01-03  value1  3.142948
3   2018-01-04  value1  5.383841
4   2018-01-05  value1  7.251399

和图表:

base = alt.Chart(data).mark_line().encode(
    x='index:T',
)

line1 = base.mark_line().encode(
    y='value:Q',
    color=alt.value('teal'),
    strokeWidth=alt.value(1)
).transform_filter(
    alt.FieldEqualPredicate(field='variable', equal='value1')
)

line2 = base.mark_line().encode(
    y='value:Q',
    color=alt.value('red'),
    strokeWidth=alt.value(4)
).transform_filter(
    alt.FieldEqualPredicate(field='variable', equal='value2')
)

alt.layer(line1, line2)

应该是这样的:

enter image description here