如何在Altair图表的Tooltip中显示当前悬停点的分数?
解决Altair悬停Tooltip不显示分数的问题
问题根源
报错的核心原因是数据结构与编码字段不匹配:如果你的数据是宽格式(比如包含cook1_score、cook2_score两个独立列),直接引用不存在的_score列会导致Altair无法识别;如果是长格式(用一列区分厨师,一列存分数),则可能是编码时未明确指定字段类型,导致Altair无法自动推断。
具体解决方案
根据两种常见的数据结构分别处理:
情况1:数据为宽格式(每列对应一个厨师的分数)
假设你的数据结构如下:
| dish | cook1_score | cook2_score | ingredient1 | ingredient2 |
|---|---|---|---|---|
| 1 | 85 | 90 | 食材A | 食材B |
| 2 | 92 | 88 | 食材C | 食材D |
此时需先通过transform_fold将宽格式转为长格式,再绑定Tooltip字段:
import altair as alt import pandas as pd # 示例数据 data = pd.DataFrame({ 'dish': [1,2,3,4], 'cook1_score': [85,92,78,95], 'cook2_score': [90,88,91,87], 'ingredient1': ['A','C','E','G'], 'ingredient2': ['B','D','F','H'] }) chart = alt.Chart(data).mark_point(size=100).encode( x=alt.X('dish:O', title='菜品编号'), y=alt.Y('value:Q', title='分数'), color=alt.Color('cook:N', title='厨师'), # 绑定转换后的字段,明确类型 tooltip=[ alt.Tooltip('dish:O', title='菜品'), alt.Tooltip('cook:N', title='厨师'), alt.Tooltip('value:Q', title='分数', format='.1f') ] ).transform_fold( # 转换宽格式为长格式,定义厨师列和分数列名称 fold=['cook1_score', 'cook2_score'], as_=['cook', 'value'] ) chart.show()
情况2:数据为长格式(一列区分厨师,一列存分数)
假设数据结构如下:
| dish | cook | score | ingredient1 | ingredient2 |
|---|---|---|---|---|
| 1 | cook1 | 85 | 食材A | 食材B |
| 1 | cook2 | 90 | 食材A | 食材B |
此时直接绑定score字段并明确类型即可:
import altair as alt import pandas as pd # 示例数据 data = pd.DataFrame({ 'dish': [1,1,2,2,3,3,4,4], 'cook': ['cook1','cook2']*4, 'score': [85,90,92,88,78,91,95,87], 'ingredient1': ['A','A','C','C','E','E','G','G'], 'ingredient2': ['B','B','D','D','F','F','H','H'] }) chart = alt.Chart(data).mark_point(size=100).encode( x=alt.X('dish:O', title='菜品编号'), y=alt.Y('score:Q', title='分数'), color=alt.Color('cook:N', title='厨师'), # 直接绑定存在的score字段,指定类型 tooltip=[ alt.Tooltip('dish:O', title='菜品'), alt.Tooltip('cook:N', title='厨师'), alt.Tooltip('score:Q', title='分数', format='.1f') ] ) chart.show()
核心注意事项
- Tooltip引用的字段**必须存在于当前数据(或转换后的数据)**中,避免引用不存在的列
- 所有编码字段需明确指定类型:
:O(有序分类)、:N(名义分类)、:Q(定量)、:T(时间),防止Altair无法推断类型报错 - 宽格式数据优先转成长格式处理,能大幅简化字段编码逻辑
内容的提问来源于stack exchange,提问作者Bram Vanroy
相关产品推荐
相关产品推荐

