我想根据滑块的值来绘制数据框的一部分(即滑块过滤在特定列中具有匹配值的行)。有些行的列中没有用于过滤的值。我希望这些行始终显示在绘图中-与滑块无关。
这里有一些代码需要澄清。在此示例中,用于过滤的列称为parameter
。
In [1]: import altair as alt
import pandas as pd
In [2]: df_with_parameter_col = pd.DataFrame(
{
"x": [1, 1],
"y": [2, 3],
"parameter": [2, 3]
}
)
df_without_parameter_col = pd.DataFrame(
{
"x": [1],
"y": [1]
}
)
In [3]: df = pd.concat([df_with_parameter_col,
df_without_parameter_col])
df
Out [3]: x y parameter
0 1 2 2.0
1 1 3 3.0
0 1 1 NaN
In [4]: slider_parameter = alt.binding_range(min=2, max=3, step=1, name="Parameter ")
select_parameter = alt.selection_single(
fields=["parameter"],
bind={"parameter": slider_parameter},
init={"parameter": 2},
name="Slider"
)
chart = alt.Chart(df).mark_point().encode(
y="y",
x="x",
).add_selection(
select_parameter
).transform_filter(
select_parameter
)
从不绘制行parameter
中缺少值的行中的数据。解决此问题的一种方法是为滑块的每个可能值复制该行 并将NaN更改为可以与滑块的值匹配的值。但是,这将在内存方面非常浪费。有更好的解决方案吗?
答案 0 :(得分:2)
您可以使用vega expression语法,使用稍微复杂一些的filter语句来执行此操作:
slider_parameter = alt.binding_range(min=2, max=3, step=1, name="Parameter ")
select_parameter = alt.selection_single(
fields=["parameter"],
bind={"parameter": slider_parameter},
init={"parameter": 2},
name="Slider" # Note: if this is changed, change the name below as well.
)
alt.Chart(df).mark_point().encode(
y="y",
x="x",
).add_selection(
select_parameter
).transform_filter(
# Note: "Slider" here matches the `name` specified for the selection.
# Its attributes are drawn from the `fields` specified for the selection.
"!isValid(datum.parameter) || (datum.parameter == Slider.parameter)"
)