如何点击热图的正方形来过滤链接的条形图? (牵牛星)

How to click on square of heatmap to filter linked bar chart? (altair)

我正在尝试获取它,因此如果我单击热图的一个方块,相邻的条形图会显示有关该方块中表示的数据的附加信息(点击时热图方块应该 "light up"上)。下面的代码让热图按照我想要的方式工作,但我不明白为什么条形图不工作。

(此外,如果我改为 interval = alt.selection_single(encodings=['x','y'],条形图开始执行我想要它做什么,但随后热图停止工作。)

import altair as alt
from vega_datasets import data
cars = data.cars()

interval = alt.selection_single()

chart = alt.Chart(cars).mark_bar().encode(
    x=alt.X('Miles_per_Gallon', bin=True), 
    y=alt.X('Horsepower', bin=True),
    color=alt.condition(interval, 'count()', alt.value('lightgray'))
).properties(
    selection=interval
)

hist = alt.Chart(cars).mark_bar().encode(
    y='count()',
    x='Origin'
).transform_filter(interval)

chart | hist

当您希望 singlemulti 选择应用于不同的数据视图时,您需要指定选择适用的 fieldsencodings,以告诉第二个图表触发什么。例如:

alt.selection_single(encodings=['x', 'y'])

出于某种原因,虽然这打破了颜色条件 - 我认为这可能是 Vega-Lite 中与选择和合并相关的一些错误。您可以通过使用两种选择来解决这个问题,一种用于突出显示,一种用于过滤器:

import altair as alt
from vega_datasets import data
cars = data.cars()

highlight = alt.selection_single()
select = alt.selection_single(encodings=['x', 'y'])

chart = alt.Chart(cars).mark_rect().encode(
    x=alt.X('Miles_per_Gallon', bin=True), 
    y=alt.X('Horsepower', bin=True),
    color=alt.condition(highlight, 'count()', alt.value('lightgray'))
).add_selection(
    highlight, select
)

hist = alt.Chart(cars).mark_bar().encode(
    y='count()',
    x='Origin'
).transform_filter(select)

chart | hist