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

如何使用Python Plotly绘制含起止时间戳的可缩放时间序列图

解决方案

你的需求是绘制时间区间内恒定值的序列图,Plotly原生支持这类步进图绘制,且自带交互缩放能力,以下是两种可行实现方案:


方案1:最简修改(适配你当前的连续区间数据)

你现有代码只需要新增2处修改即可达到效果:

  1. 提前将时间列转为pandas datetime格式,保证时间轴交互正常
  2. 给Scatter的line参数添加shape='hv',指定绘制水平优先的步进线,刚好匹配「区间内值恒定,到结束时间跳变」的特性

修改后完整代码如下:

import pandas as pd
import plotly.graph_objs as go
from plotly.offline import init_notebook_mode, iplot
init_notebook_mode(connected=True)

# 先将时间列转为datetime格式,避免后续时间轴显示异常
dff['start_timestamp'] = pd.to_datetime(dff['start_timestamp'])

trace1 = go.Scatter(
    x=dff.start_timestamp,
    y=dff.interpreted_value,
    name = "区间恒值序列",
    line = dict(color = 'blue', shape='hv'), # 新增shape参数指定为步进线
    opacity = 0.4
)

layout = dict(title='区间恒值时间序列图')
fig = dict(data=[trace1], layout=layout)
iplot(fig)

这个方案适配你给出的「上一行end_timestamp等于下一行start_timestamp」的连续区间场景,代码改动量最小。


方案2:通用方案(适配连续/非连续区间场景)

如果后续你的数据存在时间区间不连续的情况,可以用数据重构的方式实现,逻辑更可控:
把每一行数据拆为2个坐标点:(start_timestamp, interpreted_value)、(end_timestamp, interpreted_value),再把所有点按时间顺序拼接后绘图即可,代码如下:

import pandas as pd
import plotly.graph_objs as go
from plotly.offline import init_notebook_mode, iplot
init_notebook_mode(connected=True)

# 转换时间列格式
dff['start_timestamp'] = pd.to_datetime(dff['start_timestamp'])
dff['end_timestamp'] = pd.to_datetime(dff['end_timestamp'])

# 重构绘图用数据
x_list = []
y_list = []
for _, row in dff.iterrows():
    x_list.extend([row['start_timestamp'], row['end_timestamp']])
    y_list.extend([row['interpreted_value'], row['interpreted_value']])

trace1 = go.Scatter(
    x=x_list,
    y=y_list,
    name = "区间恒值序列",
    line = dict(color = 'blue'),
    opacity = 0.4
)

layout = dict(title='区间恒值时间序列图')
fig = dict(data=[trace1], layout=layout)
iplot(fig)

效果说明

Plotly生成的交互图默认支持:

  • 框选缩放、滚轮缩放、平移
  • hover显示对应点的时间和数值
  • 下载图片、重置视图等功能,完全满足你查看细节的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 21:24:06