如何使用Python Plotly绘制含起止时间戳的可缩放时间序列图
解决方案
你的需求是绘制时间区间内恒定值的序列图,Plotly原生支持这类步进图绘制,且自带交互缩放能力,以下是两种可行实现方案:
方案1:最简修改(适配你当前的连续区间数据)
你现有代码只需要新增2处修改即可达到效果:
- 提前将时间列转为pandas datetime格式,保证时间轴交互正常
- 给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
相关产品推荐
相关产品推荐

