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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 02:36:14