EMG肌电信号可视化系统【附源码】
项目概述
本项目是一个基于Python和Dash框架开发的肌电信号(EMG)数据可视化系统。该系统能够处理和展示多频率、多通道的肌电信号数据,提供了多种可视化方式,包括雷达图、柱状图、3D散点图和交互式人体肌肉图。
技术架构
核心技术栈
- 后端框架: Python + Dash
- 数据处理: NumPy, SciPy, Pandas
- 可视化: Plotly
- 前端交互: Dash Bootstrap Components, JavaScript
- 数据格式: MATLAB .mat文件
项目结构
```
file/
├── main_dash.py # 主应用程序,Dash服务器
├── Plot.py # 绘图功能模块
├── load_mat.py # 数据加载模块
├── assets/
│ ├── Muscles_front_and_back.svg # 人体肌肉SVG图
│ └── svg_clientside.js # 前端JavaScript交互
├── data/
│ └── summary_all_struct.mat # EMG数据文件
└── __pycache__/ # Python缓存文件
核心功能模块
1. 数据加载模块 (load_mat.py)
- 功能特点:
- 自动解析MATLAB .mat格式的EMG数据文件
- 动态识别多频率数据(f2, f20, f60等)
- 过滤标记通道(L-Mrk, R-Mrk)
- 计算全局归一化参数
- 核心代码逻辑:
```python
def load_summary_all(mat_path):
# 加载MATLAB文件
mat_data = sio.loadmat(mat_path, struct_as_record=False, squeeze_me=True)
# 动态识别频率字段
for attr in dir(summary):
if attr.startswith('f') and getattr(summary, attr):
freq = int(attr[1:]) # 提取频率值
# 存储pairStats, stimStats, sigStats, medianFreq
- 数据结构:
- `frequencies`: 各频率下的统计数据
- `channel_map_file`: 刺激通道映射
- `channel_map_signal`: 信号通道映射
- `global_max_per_sigChan`: 全局归一化参数
2. 绘图模块 (Plot.py)
2.1 雷达图 (generate_radar_plot)
- 功能:
- 支持以刺激通道或肌肉为中心的雷达图
- 多频率数据叠加显示
- 数据归一化处理
- 技术实现:
```python
def generate_radar_plot(data, selected_freqs, center_mode='stim', target_index=1):
# 根据中心模式筛选数据
if center_mode == 'stim':
rows = [row for row in freq_data if row.stimCh == target_index]
elif center_mode == 'muscle':
rows = [row for row in freq_data if row.sigChan == target_index]
# 归一化处理
norm_val = row.medianDelta / global_muscle_max.get(row.sigChan, 1)
2.2 柱状图 (generate_bar_plot)
- 功能:
- 展示特定肌肉在指定频率下的刺激响应
- 包含加权ΔARV、起效电流、最大响应电流等参数
2.3 3D散点图 (generate_3d_scatter_plot)
- 功能:
- 三维空间展示肌肉位置与EMG参数关系
- 支持多种Z轴参数选择(ΔARV、起效电流等)
- 频率颜色编码
2.4 SVG肌肉图 (build_svg_payload)
- 功能:
- 基于真实人体解剖结构的可视化
- 颜色映射表示肌肉激活强度
- 支持点击交互获取详细信息
- 技术特点:
- 使用LRU缓存优化性能
- 线性颜色映射算法
- 客户端-服务端协同渲染
3. 主应用程序 (main_dash.py)
3.1 应用架构
- Dash应用结构:
```python
app = dash.Dash(__name__, external_stylesheets=[dbc.themes.BOOTSTRAP])
# 布局组件
app.layout = dbc.Container([
html.H1("EMG 可视化"),
dcc.RadioItems(id='plot-type-radio'), # 图表类型选择
html.Div(id='radar-controls'), # 雷达图控制
html.Div(id='bar-controls'), # 柱状图控制
html.Div(id='scatter3d-controls'), # 3D图控制
html.Div(id='svg-controls'), # SVG图控制
html.Div(id='plot-container') # 图表容器
])
3.2 回调函数系统
- 控制面板切换:
```python
@app.callback(
Output('radar-controls', 'style'),
Output('bar-controls', 'style'),
Output('scatter3d-controls', 'style'),
Output('svg-controls','style'),
Input('plot-type-radio', 'value')
)
def toggle_control_visibility(plot_type):
# 根据图表类型显示对应控制面板
- 动态图表更新:
```python
@app.callback(
Output('plot-container', 'children'),
[Input('plot-type-radio', 'value'),
Input('center-mode-radio', 'value'),
Input('target-index-dropdown', 'value'),
# ... 其他输入参数
]
)
def update_plot(plot_type, center_mode, target_index, ...):
# 根据用户选择生成对应图表
3.3 客户端JavaScript集成
- SVG交互处理:
```python
app.clientside_callback(
ClientsideFunction(namespace='svgNS', function_name='paint'),
Output("svg-paint-sink", "data"),
Input("svg-payload-store", "data"),
Input("plot-type-radio", "value"),
)
4. 前端交互 (svg_clientside.js)
4.1 SVG颜色渲染
- 功能:
- 接收服务端颜色数据
- 动态更新SVG元素颜色
- 性能优化的批量处理
```javascript
paint: function(payload, _trigger) {
for (const id in payload) {
const el = document.getElementById(id);
if (el) {
el.style.fill = payload[id]; // 直接设置颜色
}
}
}
4.2 点击事件处理
- 功能:
- 肌肉点击检测
- 弹窗信息显示
- 坐标计算和定位
```javascript
clickInfo: function(ev, details) {
// 获取点击的肌肉ID
let id = ev.target.id;
// 创建信息弹窗
const infoWindow = document.createElement('div');
infoWindow.className = 'muscle-info-window';
// 设置弹窗样式和内容
}
数据流程
1. 数据加载流程
```
MAT文件 → load_mat.py → 数据结构化 → 全局变量存储
2. 可视化流程
```
用户选择 → Dash回调 → Plot.py生成图表 → 前端渲染
3. SVG交互流程
```
用户点击SVG → JavaScript事件 → 服务端数据查询 → 弹窗显示
技术亮点
1. 性能优化
- LRU缓存: SVG数据生成使用缓存机制
- 客户端渲染: SVG颜色更新在客户端执行
- 数据预处理: 启动时计算全局归一化参数
2. 用户体验
- 响应式设计: 使用Bootstrap组件
- 实时交互: 参数变化即时更新图表
- 多视角展示: 四种不同的可视化方式
3. 代码架构
- 模块化设计: 功能分离,便于维护
- 配置灵活: 支持多频率、多通道数据
- 扩展性强: 易于添加新的可视化类型
应用场景
1. 科研应用
- 肌电信号分析研究
- 神经肌肉功能评估
- 康复医学数据分析
2. 临床应用
- 患者肌肉功能评估
- 治疗效果监测
- 诊断辅助工具
3. 教学应用
- 生物医学工程教学
- 肌电信号原理演示
- 数据可视化案例
技术挑战与解决方案
1. 大数据量处理
- 挑战: 多频率、多通道数据量大
- 解决方案:
- 数据预处理和缓存
- 按需加载机制
- 客户端渲染优化
2. 实时交互性能
- 挑战: 参数变化需要实时更新图表
- 解决方案:
- Dash回调优化
- 客户端JavaScript处理
- 数据结构优化
3. 跨平台兼容性
- 挑战: 不同浏览器的SVG渲染差异
- 解决方案:
- 标准SVG格式
- JavaScript兼容性处理
- 渐进式增强设计
未来发展方向
1. 功能扩展
- 添加更多统计分析功能
- 支持实时数据流处理
- 集成机器学习算法
2. 性能优化
- 引入WebGL加速渲染
- 实现数据流式处理
- 优化内存使用
3. 用户体验
- 添加数据导出功能
- 支持自定义配色方案
- 实现协作分享功能
总结
本EMG可视化系统成功地将复杂的肌电信号数据转化为直观的可视化展示,通过多种图表类型和交互方式,为用户提供了全面的数据分析工具。系统采用现代Web技术栈,具有良好的扩展性和维护性,在科研、临床和教学领域都有广泛的应用前景。
通过模块化的代码架构、高效的数据处理算法和优秀的用户交互设计,该系统展示了Python在科学计算和数据可视化领域的强大能力,为类似项目的开发提供了有价值的参考。