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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 11:45:23