Altair-Python小提琴图tooltip名称字段显示undefined问题
问题根因
transform_density属于聚合转换操作,执行时仅会保留groupby参数声明的分组字段,以及转换生成的Rate、density字段,原始数据集中的Name字段会在转换环节被直接丢弃,因此无论怎么调整tooltip的字段书写格式,都无法读取到对应值,才会持续显示undefined。该问题和Name字段本身的object类型无关,之前触发的字段类型报错,本质是转换后的数据集中根本不存在Name字段。
修复方案
不要直接在密度面积图层上绑定原始电影字段的tooltip,采用双层图层叠加的方式实现效果:
- 底层保留原有水平密度面积图,作为小提琴图的可视化主体,不需要给该层绑定原始字段类的tooltip
- 上层叠加完全透明的原始数据点层,将tooltip绑定在该点层上,鼠标悬浮到小提琴图对应评分位置时,会自动触发对应电影的信息展示,透明点不会破坏原有小提琴图的视觉效果
可直接运行的修复后代码如下:
import altair as alt # 底层:小提琴图密度主体 violin_main = alt.Chart(data_trim).transform_density( 'Rate', as_=['Rate', 'density'], extent=[0, 10], groupby=['Genre_rename'] ).mark_area(orient='horizontal').encode( y=alt.Y('Rate:Q', scale=alt.Scale(domain=[0, 10])), color=alt.Color("Genre_rename", scale=alt.Scale(scheme="rainbow")), x=alt.X( 'density:Q', stack='center', impute=None, title=None, axis=alt.Axis(labels=False, values=[0], grid=True, ticks=True), ), column=alt.Column( 'Genre_rename:N', header=alt.Header( titleOrient='bottom', labelOrient='bottom', labelPadding=0, ) ) ).properties( width=100 ) # 上层:透明触发层,专门承载tooltip交互 tooltip_trigger = alt.Chart(data_trim).mark_point(opacity=0, size=12).encode( y='Rate:Q', # 固定点在每个分面的水平中心位置,匹配小提琴居中的布局 x=alt.value(50), column='Genre_rename:N', tooltip=[ alt.Tooltip("Name:N", title="电影名称"), alt.Tooltip("Rate:Q", title="评分", format=".1f") ] ).properties( width=100 ) # 合并图层,保留原有全局样式配置 plot = alt.layer(violin_main, tooltip_trigger).configure_facet( spacing=0 ).configure_view( stroke=None ) plot
补充说明:如果需要悬浮时展示同一评分位置的所有电影名称,可以将tooltip中的Name字段配置修改为
alt.Tooltip("Name:N", title="电影列表", aggregate="values"),会自动聚合同位置的所有名称批量展示,不会仅返回单条记录。
内容的提问来源于stack exchange,提问作者Alyson Riley
相关产品推荐
相关产品推荐

