Altair mark_errorband 忽略条件颜色?

问题描述 投票:0回答:1

我对 Altair 还很陌生,正在尝试在 Jupyter 笔记本中进行交互。假设我有多个值按类别划分,并且我想用误差带显示它们,并在其上添加选择。我已经走到这一步了:

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

alt.data_transformers.disable_max_rows()

# generate some data
data = pd.DataFrame(np.random.rand(1000,1),columns=["delta"])
data["time"] = np.random.rand(1000,1)
data["strategy"] = [random.choice(["some", "other", "foo"]) for x in range(0,1000)]
conditions = [data["strategy"] == "some", data["strategy"] == "other", data["strategy"] == "foo"]
offsets = [0, 2, 4]
data["delta"] = data["delta"] + np.select(conditions, offsets)

# parameters and interaction
my_bins = 50
op_slider = alt.binding_range(name="opacity", min=0, max=1, step=0.05)
my_op = alt.param(bind=op_slider, value=.7)
col_selection = alt.selection_point(fields=['strategy'])
my_col = alt.condition(col_selection, alt.Color("strategy:N").legend(None), alt.value("lightgray"))

my_x = alt.X("time:Q").bin(maxbins=my_bins)
my_y = alt.Y("delta:Q").aggregate("mean").scale(domain=(0,5),clamp=True)

# plot
band = alt.Chart(data).mark_errorband(extent="stdev", interpolate="linear", borders=False).encode(
    x=my_x, y=my_y,color=my_col,opacity=my_op
).add_params(col_selection, my_op)
line = alt.Chart(data).mark_line().encode(x=my_x,y=my_y,color=my_col).add_params(col_selection)

# clickable manual legend
selector = alt.Chart(data).mark_rect().encode(
    alt.Y("strategy:N").axis(orient="right"),
    color = my_col
).add_params(
    col_selection
)

left = band + line
left.width = 800
chart = (left | selector)
chart

此代码允许我将未通过图例选择的行灰显,但是错误带完全忽略条件着色。它有第四种颜色并聚合所有值。如果我在 mark_errorband 内将颜色静态设置为“strategy:N”,则输出是正确的,但显然忽略了选择交互。

我做错了什么?这是故意的行为吗?

我知道我可以通过 numpy 自己计算误差带,但这感觉不是重点。

python jupyter altair
1个回答
0
投票

欢迎来到 Altair 社区! =)

如果您添加

detail='strategy'
,该示例似乎可以按照您想要的方式工作。此编码创建显式分组,而不将其链接到视觉通道。我不确定为什么这里需要它,但它可能与 errorband 是区域和线条的聚合/复合标记(对于可选边框)有关。

© www.soinside.com 2019 - 2024. All rights reserved.