如何在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
相关产品推荐
相关产品推荐

