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

Plotly Timeline甘特图hover自定义数据匹配错误问题求助

解决Dash+Plotly水平时间线hover资源匹配错误的方案

一、检查数据结构与customdata绑定逻辑

  • 首先确保你的数据集是长格式:每一行对应一个Actor的单个时间段任务,必须包含Actor、Start(开始时间)、End(结束时间)、Resource(对应资源)这几个核心列,避免宽格式(比如一个Actor对应多列资源)导致的匹配错位。
  • 如果你用plotly.express.timeline,直接用hover_data参数绑定资源,无需手动处理customdata,这是最不容易出错的方式:
    import plotly.express as px
    import pandas as pd
    
    # 示例长格式数据
    df = pd.DataFrame([
        {"Actor": "Actor1", "Start": "2024-01-01", "End": "2024-01-03", "Resource": "resource1"},
        {"Actor": "Actor3", "Start": "2024-01-02", "End": "2024-01-05", "Resource": "resource3"}
    ])
    
    fig = px.timeline(df, x_start="Start", x_end="End", y="Actor", hover_data=["Resource"])
    
  • 若用plotly.graph_objects手动构建trace,必须保证每个Actor的customdata与该Actor的任务条目一一对应,不能把全量资源列表直接传入:
    import plotly.graph_objects as go
    
    fig = go.Figure()
    # 按Actor分组遍历
    for actor in df['Actor'].unique():
        subset = df[df['Actor'] == actor]
        fig.add_trace(go.Bar(
            y=[actor] * len(subset),  # 每个任务对应一个y轴条目
            x=subset['End'] - subset['Start'],  # 条形长度(时长)
            base=subset['Start'],  # 条形起始位置
            customdata=subset[['Resource']].values,  # 绑定当前Actor的资源列表
            hovertemplate=(
                "Resource: %{customdata[0]}<br>"
                "Start: %{base}<br>"
                "End: %{x+base}<extra></extra>"
            )
        ))
    
    重点:每个trace的customdata长度必须和该trace的条形数量一致,否则会出现跨Actor的资源匹配错误。

二、排查hover模板的变量引用

  • 确保hovertemplate中引用的customdata索引正确:如果customdata是单值数组(每个条形对应一个资源),用%{customdata}或%{customdata[0]},不要错误引用其他位置的变量。
  • 移除hovertemplate中的<extra></extra>可以避免显示默认的trace名称干扰,让hover信息更干净。

三、替代图表类型:专用甘特图组件

如果水平条形图的匹配问题始终无法解决,可以改用plotly.figure_factory的甘特图组件,它专门为时间线场景设计,资源与任务的绑定更直观:

from plotly.figure_factory import create_gantt

fig = create_gantt(
    df,
    task_names='Actor',
    index_col='Resource',  # 按资源分组着色
    show_colorbar=True,
    hoverinfo='task+start+end+resource'  # 直接指定hover显示的内容
)

这种方式无需手动处理customdata,组件会自动关联每个Actor时间段对应的资源,hover时直接显示正确信息。

四、快速验证排查步骤

  1. 先验证数据集本身的正确性:打印目标Actor的子集,确认Resource列值正确
    print(df[df['Actor'] == 'Actor3'])
    
  2. 打印图表的trace数据,检查每个Actor的customdata是否匹配:
    for trace in fig.data:
        print(f"Actor: {trace.name}, Custom Data: {trace.customdata}")
    
    这一步能快速定位是数据绑定错误还是hover模板的问题。

内容的提问来源于stack exchange,提问作者user1113159

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 07:15:14