如何在Python中读取.mat文件并绘制ECG心电信号?
Python读取.mat文件绘制ECG信号实现方法
你加载得到的.mat文件返回值是Python字典格式,真实心电信号存储在键为val的numpy数组中,按以下步骤处理即可完成绘制。
1. 提取有效信号数据
loadmat返回的val数组是形状为(1, 信号总长度)的二维数组,需要先压缩为一维数组才能用于绘图:
# 提取心电数据,去除长度为1的冗余维度 ecg_signal = ecg['val'].squeeze()
2. 生成时间轴(推荐)
如果知道数据对应的采样率(临床常用ECG采样率多为500Hz,即每秒采集500个信号点,可根据自己数据集实际值替换),可以生成秒为单位的时间轴作为横坐标,比直接用采样点序号更直观:
# 替换为你的数据实际采样率 fs = 500 # 生成每个采样点对应的时间序列,单位为秒 t = np.arange(len(ecg_signal)) / fs
如果暂时不确定采样率,可以跳过这步,直接用采样点序号作为横坐标绘图即可。
3. 绘图实现
你已经提前导入了matplotlib和专用的ecg_plot库,两种绘图方式都可以选择:
方式一:matplotlib快速绘制通用波形图
plt.figure(figsize=(12, 4)) # 配置了时间轴就传入t作为x参数,没配置就直接传入ecg_signal plt.plot(t, ecg_signal, linewidth=0.7) plt.title('ECG心电信号波形') plt.xlabel('时间(s)') plt.ylabel('信号幅值') plt.grid(alpha=0.3, linestyle='--') plt.tight_layout() plt.show()
方式二:ecg_plot绘制临床标准样式ECG
ecg_plot默认适配多导联ECG格式,单导联数据需要调整输入形状:
# 把一维信号调整为(导联数, 信号长度)的二维格式适配接口要求 ecg_1lead = ecg_signal.reshape(1, -1) ecg_plot.plot(ecg_1lead, sample_rate=fs, title='单导联ECG') ecg_plot.show()
注意事项
- 你代码中写的
from scipy.misc import electrocardiogram是scipy自带的公开示例ECG数据,和你自己加载的本地.mat文件无关,不需要的话可以直接删除这行导入,避免数据混淆。 - 如果绘出的波形幅值、时间尺度不对,优先检查采样率
fs的取值是否和你所用数据集的标注一致。
完整可运行参考代码
import matplotlib.pyplot as plt import ecg_plot import scipy.io as sio import numpy as np # 加载mat文件 ecg_dict = sio.loadmat('/content/hc001.mat') # 提取一维心电信号 ecg_signal = ecg_dict['val'].squeeze() # 配置采样率 fs = 500 t = np.arange(len(ecg_signal)) / fs # matplotlib绘图 plt.figure(figsize=(15, 4)) plt.plot(t, ecg_signal, color='#2c7fb8', linewidth=0.8) plt.title('单导联ECG心电信号') plt.xlabel('时间(秒)') plt.ylabel('幅值') plt.grid(linestyle='--', alpha=0.5) plt.tight_layout() plt.show() # 如需用ecg_plot绘制专业样式,取消下面两行注释即可 # ecg_plot.plot(ecg_signal.reshape(1, -1), sample_rate=fs, lead_index=['I']) # ecg_plot.show()
内容的提问来源于stack exchange,提问作者shiva
相关产品推荐
相关产品推荐

