如何为时间序列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
相关产品推荐
相关产品推荐

