绘制独立于过滤器的DataFrame的一部分

时间:2020-04-28 23:37:29

标签: python altair

我想根据滑块的值来绘制数据框的一部分(即滑块过滤在特定列中具有匹配值的行)。有些行的列中没有用于过滤的值。我希望这些行始终显示在绘图中-与滑块无关。

这里有一些代码需要澄清。在此示例中,用于过滤的列称为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更改为可以与滑块的值匹配的值。但是,这将在内存方面非常浪费。有更好的解决方案吗?

1 个答案:

答案 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)"
)

enter image description here