数据可视化指南
📊 概述
本指南帮助您将 AIECG API 返回的 ECG/PPG 数据可视化,提供常用图表库的集成示例和详细参数说明。
内容导航
- 📈 ECG 信号绘制: 单导联和12导联波形图
- 💓 PPG 信号绘制: 多通道PPG波形显示
- 📊 图表库推荐: 不同场景的最佳选择
- ⚡ 性能优化: 大数据量实时绘制技巧
📈 ECG 信号可视化
数据格式说明
从 AIECG API 获取的 ECG 数据格式:
// 单导联数据示例
const singleLeadData = {
ecgData: [512, 515, 520, 518, 525, 530, ...], // 信号数据点数组
ecgSampleRate: 500, // 采样率 500Hz(每秒500个点)
adcGain: 1000.0, // ADC增益系数
adcZero: 0.0 // ADC零点电压
};
// 12导联数据示例
const twelveLeadData = {
ecgSampleRate: 500, // 采样率
lead_I: [512, 515, 520, ...], // I 导联数据
lead_II: [510, 518, 522, ...], // II 导联数据
lead_III: [508, 520, 525, ...], // III 导联数据
lead_aVR: [505, 512, 518, ...], // aVR 导联数据
lead_aVL: [515, 520, 528, ...], // aVL 导联数据
lead_aVF: [518, 525, 532, ...], // aVF 导联数据
lead_V1: [520, 530, 538, ...], // V1 导联数据
lead_V2: [522, 532, 540, ...], // V2 导联数据
lead_V3: [525, 535, 542, ...], // V3 导联数据
lead_V4: [528, 538, 545, ...], // V4 导联数据
lead_V5: [530, 540, 548, ...], // V5 导联数据
lead_V6: [532, 542, 550, ...] // V6 导联数据
};
方案一:使用 Chart.js 绘制
安装
npm install chart.js
单导联 ECG 绘制
import Chart from 'chart.js/auto';
/**
* 绘制单导联 ECG 波形图
* @param {Array} ecgData - ECG 信号数据数组
* @param {number} samplingRate - 采样率(Hz)
* @returns {Chart} Chart.js 实例
*/
function drawECGChart(ecgData, samplingRate) {
const ctx = document.getElementById('ecgChart').getContext('2d');
// 生成时间轴数据(单位:秒)
// 例如:采样率500Hz,15000个点 = 30秒数据
const timeData = ecgData.map((_, index) => (index / samplingRate).toFixed(3));
const chart = new Chart(ctx, {
type: 'line',
data: {
labels: timeData,
datasets: [{
label: 'ECG 信号',
data: ecgData,
borderColor: '#00A86B', // 线条颜色:医疗绿
borderWidth: 1.5, // 线条宽度
pointRadius: 0, // 不显示数据点(提升性能)
tension: 0, // 线条平滑度(0=直线,0.4=平滑曲线)
fill: false // 不填充区域
}]
},
options: {
responsive: true, // 响应式布局
maintainAspectRatio: false, // 不保持宽高比,允许自定义高度
animation: false, // 禁用动画(大数据量时提升性能)
interaction: {
mode: 'nearest', // 鼠标交互模式
axis: 'x', // 只在X轴触发
intersect: false // 不需要精确悬停在点上
},
plugins: {
legend: {
display: true,
position: 'top',
labels: {
usePointStyle: true, // 使用圆点样式
padding: 15
}
},
title: {
display: true,
text: 'ECG 波形图',
font: {
size: 16,
weight: 'bold'
}
},
tooltip: {
enabled: true,
backgroundColor: 'rgba(0,0,0,0.8)',
callbacks: {
// 自定义提示框内容
label: function(context) {
return `时间: ${context.label}s, 幅值: ${context.parsed.y}`;
}
}
}
},
scales: {
x: {
type: 'linear', // 线性坐标轴
title: {
display: true,
text: '时间 (秒)',
font: { size: 14 }
},
ticks: {
maxTicksLimit: 20, // 最多显示20个刻度标签
callback: function(value) {
return value.toFixed(1); // 保留1位小数
}
},
grid: {
color: '#e8e8e8', // 网格线颜色
lineWidth: 1
}
},
y: {
title: {
display: true,
text: '幅值',
font: { size: 14 }
},
grid: {
color: '#e8e8e8',
lineWidth: 1
}
}
}
}
});
return chart;
}
// 使用示例
const ecgData = [512, 515, 520, 518, 525, ...]; // 您的 ECG 数据
const samplingRate = 500; // 采样率
const chart = drawECGChart(ecgData, samplingRate);
实现效果说明
Canvas 尺寸设置:
<!-- 建议设置固定高度,宽度自适应 -->
<canvas id="ecgChart" style="height: 400px;"></canvas>
显示效果:
- 📊 X轴:显示时间轴,范围从 0 到数据总时长(如 30 秒)
- 📈 Y轴:显示幅值,自动根据数据范围调整
- 🎨 波形:绿色连续线条,清晰展示心电波形的 P、QRS、T 波特征
- 🖱️ 交互:鼠标悬停显示精确的时间和幅值
参数说明:
| 参数 | 说明 | 推荐值 | 效果 |
|---|---|---|---|
borderWidth | 线条粗细 | 1.5-2 | 过粗影响细节,过细不清晰 |
pointRadius | 数据点大小 | 0 | 设为0隐藏点,提升性能 |
tension | 曲线平滑度 | 0 | ECG需要尖锐波形,不平滑 |
animation | 动画效果 | false | 关闭动画加速渲染 |
maxTicksLimit | X轴标签数量 | 15-20 | 避免标签过密重叠 |
方案二:使用 ECharts 绘制
安装
npm install echarts