更改 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
我想生成多折线图并仅更改绘制的其中一条线的粗细。例如
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