使用hvplot.line绘制双Y轴折线图时悬停文本格式化失效
解决hvplot多Y轴折线图HoverTool格式化失效问题
问题描述
使用hvplot.line绘制包含多个Y变量的折线图时,通过Bokeh HoverTool自定义的悬停文本格式化(如1位小数)未生效,悬停仍显示默认的3位小数;但仅绘制单个Y变量时,该格式化方法正常工作。
原因分析
当指定多个Y列时,hvplot会生成一个Overlay对象(多个子图的叠加),直接通过.opts(tools=[hover])添加自定义HoverTool时,该工具只会绑定到最后一个子图,其他子图仍使用默认的HoverTool,导致格式化效果未全局生效。
解决方案
方案1:直接使用hvplot的hover参数(推荐)
无需手动创建HoverTool,通过hover参数传入格式化规则,hvplot会自动为所有子图应用该格式:
import pandas as pd import numpy as np import hvplot.pandas hvplot.extension('bokeh') from numpy import random df = pd.DataFrame({ 'length': np.linspace(0, 4000, 6), 'slope': np.linspace(1.7, 2.4, 6), 'Direction': np.linspace(1.2, -0.5, 6), 'clearance': random.rand(6), 'weight': random.rand(6), }) # 使用hover参数指定格式化规则 df.hvplot.line( x='length', y=['slope', 'Direction'], invert=True, hover_cols=['clearance', 'weight'], hover={'clearance': '@clearance{0.0}', 'weight': '@weight{0.0}'} )
方案2:为所有子图添加自定义HoverTool
如果需要手动控制HoverTool的细节,可以遍历Overlay中的每个子图,为每个子图添加自定义工具:
import pandas as pd import numpy as np import hvplot.pandas hvplot.extension('bokeh') from numpy import random from bokeh.models import HoverTool df = pd.DataFrame({ 'length': np.linspace(0, 4000, 6), 'slope': np.linspace(1.7, 2.4, 6), 'Direction': np.linspace(1.2, -0.5, 6), 'clearance': random.rand(6), 'weight': random.rand(6), }) hover = HoverTool(tooltips=[('clearance', '@clearance{0.0}'), ('weight', '@weight{0.0}')]) # 生成多Y轴折线图,遍历每个子图添加自定义HoverTool plot = df.hvplot.line( x='length', y=['slope', 'Direction'], invert=True, hover_cols=['clearance', 'weight'] ) # 为Overlay中的每个子图添加工具 plot = plot.map(lambda elem: elem.opts(tools=[hover])) plot
验证效果
两种方案都能让所有Y变量对应的折线图悬停时,clearance和weight显示为1位小数,解决多Y轴场景下格式化失效的问题。
内容的提问来源于stack exchange,提问作者Giao
相关产品推荐
相关产品推荐

