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

如何在Plotly折线图的线条间隙间添加注释?

问题描述

现有Plotly图表(当前注释位于数据点symbol上方),希望将标注“X days”的注释添加在折线的两个数据点之间,预期效果为注释位于两点连线的中间位置。当前使用的注释代码如下:

fig.add_annotation(
    go.layout.Annotation(
        x=row["order_date"],
        y=row["sales"],
        text=f"{row['time_diff']} days",
        showarrow=False,
        align='center',
        yanchor='auto',
        yshift=10,
        textangle=-0
    )
)
解决方案

要实现注释位于两个数据点之间的需求,核心是计算相邻两点的中间坐标,再将注释定位到该位置,具体步骤如下:

  • 计算相邻点的中间X值:若数据已按order_date排序,对每个点(除最后一个),取其与下一个点的时间戳平均值,再转回datetime类型。例如:(current_date.timestamp() + next_date.timestamp())/2。
  • 计算相邻点的中间Y值:取相邻两个点sales值的平均值,即(current_sales + next_sales)/2。
  • 调整注释定位参数:将计算得到的中间坐标赋值给注释的x和y,同时把yanchor设为middle让注释在Y方向居中,按需调整yshift优化显示位置。

修改后的代码示例(基于DataFrame数据)

import pandas as pd
from datetime import datetime
import plotly.graph_objects as go

# 假设df为已按order_date排序的数据集
df['next_order_date'] = df['order_date'].shift(-1)
df['next_sales'] = df['sales'].shift(-1)

fig = go.Figure()
# 先绘制折线图(此处省略你的基础绘图代码)

# 遍历除最后一行外的所有行,添加中间注释
for idx, row in df.iloc[:-1].iterrows():
    # 计算中间X坐标
    mid_x_ts = (row["order_date"].timestamp() + row["next_order_date"].timestamp()) / 2
    mid_x = datetime.fromtimestamp(mid_x_ts)
    # 计算中间Y坐标
    mid_y = (row["sales"] + row["next_sales"]) / 2
    
    fig.add_annotation(
        go.layout.Annotation(
            x=mid_x,
            y=mid_y,
            text=f"{row['time_diff']} days",
            showarrow=False,
            align='center',
            yanchor='middle',
            yshift=0,
            textangle=0
        )
    )

fig.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 12:37:20