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

如何为时间序列DataFrame生成睡眠分期阶梯图(Hypnogram)

问题

我有一个包含分期信息的时间序列DataFrame,数据如下:

import pandas as pd
d = {'Stages': ['Stage 1', 'Stage 2', 'Stage 2', 'Stage 2', 'Stage 3', 'Stage 1'], 'Start(s)': [0, 630, 780, 840, 900, 930], 'End(s)': [630, 780, 840, 900, 930, 960]}
df = pd.DataFrame(data=d)

对应的DataFrame为:

Stages  Start(s)  End(s)
0  Stage 1         0     630
1  Stage 2       630     780
2  Stage 2       780     840
3  Stage 2       840     900
4  Stage 3       900     930
5  Stage 1       930     960

我希望生成类似睡眠分期图(Hypnogram)的阶梯图,已完成分期字符串到数值的映射:

# 替换字符串形式的分期
mapping = {'Stage 1': 1, 'Stage 2': 2,'Stage 3': 3}
DF = df.replace({'Stages': mapping})

得到的DataFrame为:

Stages  Start(s)  End(s)
0       1         0     630
1       2       630     780
2       2       780     840
3       2       840     900
4       3       900     930
5       1       930     960

请问如何实现生成该类型的阶梯图?

解决方案

可以用matplotlib的step()函数实现这种阶梯图,它能直接生成水平阶梯状线条,匹配分期随时间变化的特征。以下是完整实现:

完整代码

import pandas as pd
import matplotlib.pyplot as plt

# 构建数据
d = {'Stages': ['Stage 1', 'Stage 2', 'Stage 2', 'Stage 2', 'Stage 3', 'Stage 1'], 
     'Start(s)': [0, 630, 780, 840, 900, 930], 
     'End(s)': [630, 780, 840, 900, 930, 960]}
df = pd.DataFrame(data=d)

# 分期映射
mapping = {'Stage 1': 1, 'Stage 2': 2,'Stage 3': 3}
DF = df.replace({'Stages': mapping})

# 准备绘图数据:将每个阶段的起始、结束时间对应到分期值
x = []
y = []
for idx, row in DF.iterrows():
    x.append(row['Start(s)'])
    x.append(row['End(s)'])
    y.append(row['Stages'])
    y.append(row['Stages'])

# 绘制阶梯图
plt.figure(figsize=(12, 4))
# where='post'表示在时间点之后切换分期,匹配数据的时间区间逻辑
plt.step(x, y, where='post', linewidth=2, color='black')

# 设置坐标轴与标题
plt.xlabel('时间(秒)')
plt.ylabel('睡眠分期')
plt.title('睡眠分期阶梯图')

# 将y轴数值刻度替换为原始分期名称
plt.yticks([1,2,3], ['Stage 1', 'Stage 2', 'Stage 3'])

# 调整布局并显示
plt.tight_layout()
plt.show()

关键说明

  • step()函数的where='post'是核心:它指定阶梯在时间点之后切换到新分期值,完美匹配Start(s)为分期开始、End(s)为分期结束的逻辑。
  • 把每个阶段的起始、结束时间都加入x轴列表,同时重复对应分期值到y轴列表,确保阶梯在每个时间节点准确切换。
  • 用yticks()替换刻度文本,让图表更直观易读。

如果需要优化样式,可添加plt.grid()开启网格,或调整linewidth、color参数修改线条样式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 13:50:23