无法让 transform_filter 在 Altair 中工作

Can't get transform_filter to work in Altair

对于我的教学笔记,我正在尝试在 Altair 中实现 this vega-lite 示例:

{
  "data": {"url": "data/seattle-weather.csv"},
  "layer": [{
    "params": [{
      "name": "brush",
      "select": {"type": "interval", "encodings": ["x"]}
    }],
    "mark": "bar",
    "encoding": {
      "x": {
        "timeUnit": "month",
        "field": "date",
        "type": "ordinal"
      },
      "y": {
        "aggregate": "mean",
        "field": "precipitation",
        "type": "quantitative"
      },
      "opacity": {
        "condition": {
          "param": "brush", "value": 1
        },
        "value": 0.7
      }
    }
  }, {
    "transform": [{
      "filter": {"param": "brush"}
    }],
    "mark": "rule",
    "encoding": {
      "y": {
        "aggregate": "mean",
        "field": "precipitation",
        "type": "quantitative"
      },
      "color": {"value": "firebrick"},
      "size": {"value": 3}
    }
  }]
}

我很容易获得单独的图表(条形图和规则),但我 运行 遇到了使 mark_rule 互动的问题。

import altair as alt
from vega_datasets import data


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

base = alt.Chart(df).add_selection(selection)

bar_i = base.mark_bar().encode(
    x="month(date):T",
    y="mean(precipitation):Q",
    opacity=alt.condition(selection, alt.value(1.0), alt.value(0.7)))

rule_i = base.mark_rule().transform_filter(selection).encode(y="mean(precipitation):Q")

(bar_i + rule_i).properties(width=600)

错误显示

Javascript Error: Duplicate signal name: "selector013_scale_trigger"
This usually means there's a typo in your chart specification. See the javascript console for the full traceback.

看起来您有兴趣创建的图表是 Altair 示例库的一部分:https://altair-viz.github.io/gallery/selection_layer_bar_month.html

import altair as alt
from vega_datasets import data

source = data.seattle_weather()
brush = alt.selection(type='interval', encodings=['x'])

bars = alt.Chart(source).mark_bar().encode(
    x='month(date):O',
    y='mean(precipitation):Q',
    opacity=alt.condition(brush, alt.OpacityValue(1), alt.OpacityValue(0.7)),
).add_selection(
    brush
)

line = alt.Chart(source).mark_rule(color='firebrick').encode(
    y='mean(precipitation):Q',
    size=alt.SizeValue(3)
).transform_filter(
    brush
)

bars + line

您看到的错误是由于 base 包含选区,并且两个图层都派生自 base,因此同一选区在单个图表中声明了两次。