Altair<5:实现Hover时仅显示关联字段而非全部字段
解决Altair<5中Hover提示框仅显示当前厨师信息的问题
问题分析
当前代码通过melt处理数据时保留了cook1和cook2两个字段,导致hover提示框会同时展示两位厨师的菜品信息。要实现仅显示当前hover点对应厨师的信息,需要调整数据结构,让每行数据仅关联单个厨师的信息。
解决方案
重新构造长格式数据集,将两位厨师的数据拆分后分别处理,再合并为每行仅包含单个厨师信息的结构,这样提示框就能精准展示当前hover对象的内容。
修改后的完整代码:
import altair as alt import pandas as pd alt.renderers.enable("altair_viewer") df = pd.DataFrame({ "ingredient1": ["potato", "onion", "carrot", "beet"], "ingredient2": ["tomato", "pepper", "zucchini", "lettuce"], "dish": [1, 2, 3, 4], "cook1": ["cook1 dish1", "cook1 dish2", "cook1 dish3", "cook1 dish4"], "cook1_score": [0.4, 0.3, 0.7, 0.9], "cook2": ["cook2 dish1", "cook2 dish2", "cook2 dish3", "cook2 dish4"], "cook2_score": [0.6, 0.2, 0.5, 0.6], }) # 拆分并重构数据,每行仅保留单个厨师的信息 df_cook1 = df[["dish", "ingredient1", "ingredient2", "cook1", "cook1_score"]].rename( columns={"cook1": "cook_info", "cook1_score": "score"} ) df_cook1["cook"] = "cook1" df_cook2 = df[["dish", "ingredient1", "ingredient2", "cook2", "cook2_score"]].rename( columns={"cook2": "cook_info", "cook2_score": "score"} ) df_cook2["cook"] = "cook2" df_melt = pd.concat([df_cook1, df_cook2], ignore_index=True) nearest_dish = alt.selection(type="single", nearest=True, on="mouseover", fields=["dish"], empty="none") # 主图表:提示框仅包含当前厨师的信息 chart = alt.Chart(df_melt).mark_circle().encode( x="dish:O", y="score:Q", color="cook:N", tooltip=["dish", "ingredient1", "ingredient2", "cook", "cook_info", "score"] ).add_selection( nearest_dish ) # 垂直线部分保持不变 vertical_line = alt.Chart(df_melt).mark_rule(color="gray").encode( x="dish:O", ).transform_filter( nearest_dish ) layer = alt.layer( chart, vertical_line ).properties( width=600, height=300 ).interactive() layer.show()
关键修改点
- 数据结构调整:将原数据集拆分为
cook1和cook2两个子数据集,分别重命名字段后合并,确保每行仅对应一位厨师的菜品和分数信息。 - 提示框字段优化:tooltip仅包含当前行的
cook(厨师名称)、cook_info(当前厨师的菜品描述)及score(分数),避免冗余信息。
内容的提问来源于stack exchange,提问作者Bram Vanroy
相关产品推荐
相关产品推荐

