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

如何在Plotly中可视化上月/全年数据时标注最近一周的数据?

用Plotly标注折线图中最近一周的所有数据点

原有代码可以实现标注折线图的最后一个数据点,要扩展为标注最近一周的所有数据点,只需在筛选数据和添加标注trace的环节做调整,以下是完整实现代码:

# imports
import pandas as pd
import plotly.express as px
from datetime import timedelta

# data
df = px.data.stocks()
df = df.drop('AMZN', axis = 1)
# 转换日期格式为datetime,方便后续筛选
df['date'] = pd.to_datetime(df['date'])
colors = px.colors.qualitative.T10

# plotly
fig = px.line(df, 
                 x = 'date',
                 y = [c for c in df.columns if c != 'date'],
                 template = 'plotly_dark',
                 color_discrete_sequence = colors,
                 title = 'Stocks (最近一周数据标注)', 
             )

# move legend
fig.layout.legend.x = -0.3

# 计算最近一周的起始日期:取数据中最晚日期往前推7天
latest_date = df['date'].max()
one_week_ago = latest_date - timedelta(days=7)

# 遍历每个trace,添加最近一周数据点的标注
for i, d in enumerate(fig.data):
    # 将当前trace的日期数据转为datetime,匹配筛选条件
    trace_dates = pd.to_datetime(d.x)
    # 筛选出最近一周的索引
    week_indices = [idx for idx, date in enumerate(trace_dates) if date >= one_week_ago]
    # 获取最近一周的x和y数据
    week_x = [d.x[idx] for idx in week_indices]
    week_y = [d.y[idx] for idx in week_indices]
    
    fig.add_scatter(x=week_x, y=week_y,
                    mode = 'markers+text',
                    text = [round(y, 2) for y in week_y],  # 保留两位小数让文本更整洁
                    textfont = dict(color=d.line.color),
                    textposition='middle right',
                    marker = dict(color = d.line.color, size = 10),
                    legendgroup = d.name,
                    showlegend=False)

fig.show()

关键修改说明:

  • 日期格式转换:先把原始数据的date列转为datetime类型,方便后续日期范围筛选
  • 计算最近一周范围:通过数据中最晚日期往前推7天,确定最近一周的起始点
  • 筛选最近一周数据:针对每个折线trace,筛选出属于最近一周的所有数据点索引,提取对应的x(日期)和y(数值)
  • 标注优化:给标注文本保留两位小数,让图表更美观;调整marker大小避免遮挡折线

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 10:47:13