Altair图层图表Y轴分辨率不相同

时间:2020-09-08 14:29:50

标签: python altair

我正在尝试绘制数据并将其与设置为固定值的阈值进行比较。创建series object图表时,两个图层的y轴似乎都不成立。 layered也是如此。

我发现hconcat提到了.resolve_scale(y='shared'),但这似乎不起作用。当我将规则指定为5时,它出现在15之上。

np.random.seed(42)
df = pd.DataFrame({
    'x': np.linspace(0, 10, 500),
    'y': np.random.randn(500).cumsum()
})

base = alt.Chart(df)
line = base.mark_line().encode(x='x', y='y')
rule = base.mark_rule().encode(y=alt.value(5))

alt.layer(line, rule).resolve_scale(y='shared')

layered chart incorrect display

要使规则显示为值5,我必须将其设置为110。

rule = base.mark_rule().encode(y=alt.value(110))

alt.layer(line, rule).resolve_scale(y='shared')

layered chart incorrect value

如何编辑图表,以使规则显示在指定的y值?

1 个答案:

答案 0 :(得分:1)

Altair标尺将一个映射到一个 range domain 描述数据值的范围,而 range 描述这些值映射到的视觉特征的范围。对于颜色编码,范围可能是"red""blue""green"等。对于诸如xy之类的位置编码,范围是像素位置图表上标记的位置。

使用alt.value时,是在指定范围值,而不是域值。这就是为什么您可以使用color=alt.value('red')之类的编码来指定您希望标记显示为红色的原因。当您执行y=alt.value(5)时,就是说您希望标记显示在y轴顶部5像素处。

Vega-Lite的最新版本增加了通过datum而不是value指定域值的功能,但是不幸的是Altair尚不支持此功能,因此唯一可行的方法是具有具有所需值的数据字段。例如:

line = base.mark_line().encode(x='x', y='y')
rule = alt.Chart(pd.DataFrame({'y': [5]})).mark_rule().encode(y='y')

alt.layer(line, rule).resolve_scale(y='shared')

enter image description here