Altair 中的交互式绘图选择不会突出显示点
Interactive plot selection in Altair does not hi-light points
我正在尝试在 Altair 中生成 2 个共享相同 selection
的地块。
我想绘制人口 (y) 与年龄 (x) 的散点图和条形图。我正在使用 Altair 内置数据集 population
。人口是此数据集中 people
列的总和。数据集包含 year
、people
、age
和 sex
的列。我可以使用 sum(people)
获得总填充并将其绘制为 y
对 age
。对于条形图,我可以使用 sex
列类似地绘制 sum(people)
与年龄和颜色的关系。
我正在尝试在这两个图之间设置一个 brush/selection,以便我可以在散点图中突出显示,同时更新条形图以反映 selection。但是,我遇到了以下问题
我正在使用 Altair 文档中的 layered bar graph example 作为示例。
这是代码
import altair as alt
from altair.expr import datum, if_
from vega_datasets import data
interval = alt.selection_interval(encodings=['x', 'y'])
df = data.population.url
scatter = alt.Chart(df).mark_point().encode(
alt.X('age:O', axis=alt.Axis(title='')),
y='sum(people)',
color=alt.condition(interval, 'sex:N', alt.value('lightgrey'))
).transform_filter(
filter = datum.year == 2000
).transform_calculate(
"sex", if_(datum.sex == 2, 'Female', 'Male')
).properties(
selection=interval
)
bar = alt.Chart(df).mark_bar(opacity=0.7).encode(
alt.X('age:O', scale=alt.Scale(rangeStep=17)),
alt.Y('sum(people)', stack=None),
color=alt.condition(interval, 'sex:N', alt.value('lightgrey')),
).transform_filter(
filter = datum.year == 2000
).transform_calculate(
"sex", if_(datum.sex == 2, 'Female', 'Male')
).properties(height=100, width=400)
scatter & bar
我修改了文档示例中的代码。我首先创建一个散点图,然后使用基于 selection
的颜色。然后我定义了相同 2 列的条形图并再次使用 selection
指定颜色。这是输出
现在,我想在顶部(散点)图上拖一个框到 select 一些点,同时底部(条形图)图表应根据 selection
更新。当我拖入顶部绘图以制作我的 selection
时,会发生这种情况
问题
- 在顶部绘图中拖动生成 selection 后,两个绘图中的颜色(selection 的内部和外部)都更改为
lightgrey
。我预计,在这两个图中,selection/brush 内部会被高亮显示,但外部应该是 lightgrey
.
如何获得同时在顶部和底部图中突出显示的 select离子?
编辑
我想要 this behaviour,其中一个图中的 brush/selection 在第二个(链接的)图中同时突出显示。
包版本:
Python = 3.6
Altair = 2.2
Jupyter = 5.6
要触发对聚合值的选择,最好的方法是使用聚合转换来定义该数量,以便它可用于整个图表。
这是一个例子:
import altair as alt
from altair.expr import datum, if_
from vega_datasets import data
interval = alt.selection_interval(encodings=['x', 'y'])
base = alt.Chart(data.population.url).transform_filter(
filter = datum.year == 2000
).transform_calculate(
"sex", if_(datum.sex == 2, 'Female', 'Male')
).transform_aggregate(
population="sum(people)",
groupby=['age', 'sex']
)
scatter = base.mark_point().encode(
alt.X('age:O', title=''),
y='population:Q',
color=alt.condition(interval, 'sex:N', alt.value('lightgrey'))
).properties(
selection=interval
)
bar = base.mark_bar(opacity=0.7).encode(
alt.X('age:O', scale=alt.Scale(rangeStep=17)),
alt.Y('population:Q'),
color=alt.condition(interval, 'sex:N', alt.value('lightgrey')),
).properties(height=100, width=400)
scatter & bar
请注意,我取消了下图中间隔选择的过滤,因为这不是您描述的行为。
基于(并改编)上述@jakevdp 的回答,我在文档库的交互式图表部分尝试了类似于 this example 的内容。
我没有使用 base
对象,而是使用 vconcat
函数,它连接 Chart
实例并将转换和数据传递给 vconcat
对象。这是方法
import altair as alt
from altair.expr import datum, if_
from vega_datasets import data
interval = alt.selection_interval(encodings=['x', 'y'])
scatter = alt.Chart().mark_point().encode(
alt.X('age:O', title=''),
y='population:Q',
color=alt.condition(interval, 'sex:N', alt.value('lightgrey'))
).properties(
selection=interval
)
bar = alt.Chart().mark_bar(opacity=0.7).encode(
alt.X('age:O', scale=alt.Scale(rangeStep=17)),
alt.Y('population:Q'),
color=alt.condition(interval, 'sex:N', alt.value('lightgrey')),
).properties(height=100, width=400)
alt.vconcat(scatter, bar,
data=data.population.url
).transform_filter(
filter = datum.year == 2000
).transform_calculate(
"sex", if_(datum.sex == 2, 'Female', 'Male')
).transform_aggregate(
population="sum(people)",
groupby=['age', 'sex']
)
这种方法似乎提供与@jakevdp 的 answer.i.e 相同的功能。可以对散点图(顶部)进行选择,这将根据需要反映在条形图(底部)中。
我正在尝试在 Altair 中生成 2 个共享相同 selection
的地块。
我想绘制人口 (y) 与年龄 (x) 的散点图和条形图。我正在使用 Altair 内置数据集 population
。人口是此数据集中 people
列的总和。数据集包含 year
、people
、age
和 sex
的列。我可以使用 sum(people)
获得总填充并将其绘制为 y
对 age
。对于条形图,我可以使用 sex
列类似地绘制 sum(people)
与年龄和颜色的关系。
我正在尝试在这两个图之间设置一个 brush/selection,以便我可以在散点图中突出显示,同时更新条形图以反映 selection。但是,我遇到了以下问题
我正在使用 Altair 文档中的 layered bar graph example 作为示例。
这是代码
import altair as alt
from altair.expr import datum, if_
from vega_datasets import data
interval = alt.selection_interval(encodings=['x', 'y'])
df = data.population.url
scatter = alt.Chart(df).mark_point().encode(
alt.X('age:O', axis=alt.Axis(title='')),
y='sum(people)',
color=alt.condition(interval, 'sex:N', alt.value('lightgrey'))
).transform_filter(
filter = datum.year == 2000
).transform_calculate(
"sex", if_(datum.sex == 2, 'Female', 'Male')
).properties(
selection=interval
)
bar = alt.Chart(df).mark_bar(opacity=0.7).encode(
alt.X('age:O', scale=alt.Scale(rangeStep=17)),
alt.Y('sum(people)', stack=None),
color=alt.condition(interval, 'sex:N', alt.value('lightgrey')),
).transform_filter(
filter = datum.year == 2000
).transform_calculate(
"sex", if_(datum.sex == 2, 'Female', 'Male')
).properties(height=100, width=400)
scatter & bar
我修改了文档示例中的代码。我首先创建一个散点图,然后使用基于 selection
的颜色。然后我定义了相同 2 列的条形图并再次使用 selection
指定颜色。这是输出
现在,我想在顶部(散点)图上拖一个框到 select 一些点,同时底部(条形图)图表应根据 selection
更新。当我拖入顶部绘图以制作我的 selection
时,会发生这种情况
问题
- 在顶部绘图中拖动生成 selection 后,两个绘图中的颜色(selection 的内部和外部)都更改为
lightgrey
。我预计,在这两个图中,selection/brush 内部会被高亮显示,但外部应该是lightgrey
.
如何获得同时在顶部和底部图中突出显示的 select离子?
编辑
我想要 this behaviour,其中一个图中的 brush/selection 在第二个(链接的)图中同时突出显示。
包版本:
Python = 3.6
Altair = 2.2
Jupyter = 5.6
要触发对聚合值的选择,最好的方法是使用聚合转换来定义该数量,以便它可用于整个图表。
这是一个例子:
import altair as alt
from altair.expr import datum, if_
from vega_datasets import data
interval = alt.selection_interval(encodings=['x', 'y'])
base = alt.Chart(data.population.url).transform_filter(
filter = datum.year == 2000
).transform_calculate(
"sex", if_(datum.sex == 2, 'Female', 'Male')
).transform_aggregate(
population="sum(people)",
groupby=['age', 'sex']
)
scatter = base.mark_point().encode(
alt.X('age:O', title=''),
y='population:Q',
color=alt.condition(interval, 'sex:N', alt.value('lightgrey'))
).properties(
selection=interval
)
bar = base.mark_bar(opacity=0.7).encode(
alt.X('age:O', scale=alt.Scale(rangeStep=17)),
alt.Y('population:Q'),
color=alt.condition(interval, 'sex:N', alt.value('lightgrey')),
).properties(height=100, width=400)
scatter & bar
请注意,我取消了下图中间隔选择的过滤,因为这不是您描述的行为。
基于(并改编)上述@jakevdp 的回答,我在文档库的交互式图表部分尝试了类似于 this example 的内容。
我没有使用 base
对象,而是使用 vconcat
函数,它连接 Chart
实例并将转换和数据传递给 vconcat
对象。这是方法
import altair as alt
from altair.expr import datum, if_
from vega_datasets import data
interval = alt.selection_interval(encodings=['x', 'y'])
scatter = alt.Chart().mark_point().encode(
alt.X('age:O', title=''),
y='population:Q',
color=alt.condition(interval, 'sex:N', alt.value('lightgrey'))
).properties(
selection=interval
)
bar = alt.Chart().mark_bar(opacity=0.7).encode(
alt.X('age:O', scale=alt.Scale(rangeStep=17)),
alt.Y('population:Q'),
color=alt.condition(interval, 'sex:N', alt.value('lightgrey')),
).properties(height=100, width=400)
alt.vconcat(scatter, bar,
data=data.population.url
).transform_filter(
filter = datum.year == 2000
).transform_calculate(
"sex", if_(datum.sex == 2, 'Female', 'Male')
).transform_aggregate(
population="sum(people)",
groupby=['age', 'sex']
)
这种方法似乎提供与@jakevdp 的 answer.i.e 相同的功能。可以对散点图(顶部)进行选择,这将根据需要反映在条形图(底部)中。