在 Altair 中使用共享 selector/filter 在不同图表中绘制两个数据帧

Plot two dataframes in different charts with shared selector/filter in Altair

我有两个 pandas 数据帧 datadata_queue 具有包含相似数据的相同结构。 前者绘制成一条线,后者绘制成散点图。 我需要一个共享选择器来过滤两个图表。 在下面的示例中,选择器仅在我删除 scatter.

时才起作用

如何在 Altair 中实现?

注意:我需要最后一个layer来为线图添加工具提示、规则、文本等。为了便于阅读,我在这里省略了那部分。

input_dropdown = alt.binding_select(options=data.koplus_name.unique().tolist())
selection = alt.selection_single(fields=['koplus_name'], bind=input_dropdown, name='Koplus', init={'koplus_name': input_dropdown.options[0]})


line = alt.Chart(data).mark_line().encode(
    x=alt.X('yearmonthdatehoursminutes(timestamp)', title='timestamp', scale=alt.Scale(domain=(str(data.timestamp.min()), str(data.timestamp.min() + pd.Timedelta(value=1, unit='D'))))),
    y=alt.Y('value', axis=alt.Axis(title=''), scale=alt.Scale(domain=(0, data.value.max()))),
    color=alt.Color('variable', legend=alt.Legend(title=None)),
)

scatter = alt.Chart(data_queue).mark_point().encode(
    x='green time',
    y='value',
)

chart = line + scatter

layer = alt.layer(
    chart
).add_selection(
    selection
).transform_filter(
    selection
).properties(
    width=800, height=250
).interactive(bind_y=False)

如果您希望数据响应相同的选择,它必须是相同数据源的一部分。您可以在创建图表之前在 pandas 中加入数据集,或者在 Altair 语法中使用 Lookup Transform 加入数据集。

这是第二种方法的一个例子,有一些小数据集:

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

df1 = pd.DataFrame({
    'x': np.arange(100),
    'y': np.random.randn(100).cumsum()
})

df2 = pd.DataFrame({
    'x': np.arange(100),
    'z': np.random.randn(100).cumsum()
})

selection = alt.selection_interval(encodings=['x'])

base = alt.Chart(df1).transform_lookup(
  lookup='x',
  from_=alt.LookupData(data=df2, key='x', fields=['z'])
).mark_point(color='steelblue').encode(
  x='x:Q',
  color=alt.condition(selection, alt.value('steelblue'), alt.value('lightgray'))
)

alt.layer(
  base.encode(y='y:Q'),
  base.encode(y='z:Q')
).add_selection(
  selection
)