如何在Altair刷选联动中添加显示平均值的交互式规则标记?
解决Altair电影散点图添加选区平均评分规则线的问题
修正后的完整代码
import altair as alt from vega_datasets import data # 加载数据集 movies = data.movies.url brush = alt.selection_interval( encodings=['x'] # 限制选择到x轴(年份) ) # 年份直方图,带区间选择 years = alt.Chart(movies).mark_bar().add_selection( brush ).encode( alt.X('year(Release_Date):T', title='Films by Release Year'), alt.Y('count():Q', title=None) ).properties( width=650, height=50 ) # 散点图,根据选区调整透明度 ratings = alt.Chart(movies).mark_circle().encode( x='Rotten_Tomatoes_Rating:Q', y='IMDB_Rating:Q', tooltip='Title:N', opacity=alt.condition(brush, alt.value(0.75), alt.value(0.05)) ).properties( width=650, height=400 ) # 聚合选区内的平均评分数据 mean_ratings = alt.Chart(movies).transform_filter( brush ).transform_aggregate( mean_rt='mean(Rotten_Tomatoes_Rating)', mean_imdb='mean(IMDB_Rating)', groupby=[] # 整体聚合,不分组 ) # 垂直规则线:显示选区内平均烂番茄评分 rt_rule = mean_ratings.mark_rule(color='firebrick').encode( x='mean_rt:Q', size=alt.SizeValue(2), opacity=alt.condition(brush, alt.value(1), alt.value(0)) # 无选区时隐藏 ) # 水平规则线:显示选区内平均IMDB评分 imdb_rule = mean_ratings.mark_rule(color='navy').encode( y='mean_imdb:Q', size=alt.SizeValue(2), opacity=alt.condition(brush, alt.value(1), alt.value(0)) ) # 烂番茄均值文本标注 rt_text = mean_ratings.mark_text(align='left', dx=5, dy=-10, color='firebrick').encode( x='mean_rt:Q', y=alt.value(30), # 固定y位置,避免随数据变化 text=alt.Text('mean_rt:Q', format='.1f'), opacity=alt.condition(brush, alt.value(1), alt.value(0)) ) # IMDB均值文本标注 imdb_text = mean_ratings.mark_text(align='right', dx=-5, dy=5, color='navy').encode( x=alt.value(60), # 固定x位置 y='mean_imdb:Q', text=alt.Text('mean_imdb:Q', format='.1f'), opacity=alt.condition(brush, alt.value(1), alt.value(0)) ) # 组合所有图表 alt.vconcat(years, ratings + rt_rule + imdb_rule + rt_text + imdb_text).properties(spacing=5)
关键修改点说明
- 调整选择逻辑:移除原代码中用于鼠标悬停的
label选择,改用brush区间选择驱动均值计算,匹配课后练习的年份选区需求。 - 添加聚合转换:通过
transform_aggregate统计brush选中年份区间内的平均评分,确保数据计算仅针对选区范围。 - 控制元素显隐:用
opacity条件判断,仅当存在年份选区时显示规则线和均值文本,避免无选区时的冗余显示。 - 分离图表元素:将均值规则线和文本从散点图独立出来,避免继承散点图的透明度等编码属性导致的显示异常。
- 优化数值格式:用
format='.1f'让均值保留一位小数,提升可读性。
内容的提问来源于stack exchange,提问作者Murtaza Ali
相关产品推荐
相关产品推荐

