You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 07:43:24