Matlab中归一化时长数据并同图绘制的技术咨询
时间序列数据归一化与同图绘制解决方案
问题描述
现有多组时间序列数据,X轴为HHmmss格式的时间字符串,每组时间点数量不同,但均处于2小时时长范围内。需要将X轴转换为相对于每组起始时间的分钟级时长(实现时间轴归一化),并在同一图中绘制所有数据集。原代码通过选取set0的前N个时间点计算偏移的方式存在逻辑错误,无法实现准确归一化。
核心思路
时间归一化的正确逻辑是:每组数据以自身的第一个时间点为时间零点,计算每个时间点相对于该零点的分钟数。这样所有组的X轴起点均为0,对应各自实验的开始时刻,实现时间轴的对齐。
优化后的MATLAB代码
% 定义所有数据集 set0 = struct('time', ["085440","091530","092000","093020","100000","100020","101325"], ... 'ydata', [30 50 60 72 82 85 88]); set1 = struct('time', ["121101","121105","130001","133025","140000"], ... 'ydata', [40 50 60 70 89]); set2 = struct('time', ["103235","110010","120000","130130"], ... 'ydata', [37.8 70 85.7 93.6]); % 时间转换与归一化函数 function norm_min = normalize_time(time_strs) % 拆分时、分、秒字符串并转为数值 hours = str2double(extractBefore(time_strs(:), 3)); mins = str2double(extractBetween(time_strs(:), 3, 4)); secs = str2double(extractAfter(time_strs(:), 4)); % 转为duration类型 durations = duration(hours, mins, secs); % 计算相对于组内第一个时间点的分钟数 norm_min = minutes(durations - durations(1)); end % 处理每组数据的时间轴 set0.t_norm = normalize_time(set0.time); set1.t_norm = normalize_time(set1.time); set2.t_norm = normalize_time(set2.time); % 绘图 figure('Color','w') scatter(set0.t_norm, set0.ydata, 'Marker','o', 'DisplayName','set0') hold on scatter(set1.t_norm, set1.ydata, 'Marker','*', 'DisplayName','set1') scatter(set2.t_norm, set2.ydata, 'Marker','+', 'DisplayName','set2') hold off xlabel('相对于起始时间的时长(分钟)'); ylabel('数据值'); legend('Location','best') grid on
代码解释
- 数据结构化:用
struct打包每组的时间和数据,让代码结构更清晰整洁。 - 函数复用:将时间转换和归一化逻辑封装成独立函数,避免重复编写相同代码,同时便于后续修改维护。
- 正确归一化:每组时间轴基于自身起始点计算偏移,确保所有组的X轴零点对应各自实验开始,彻底解决原代码的逻辑错误。
- 绘图优化:设置白色背景、调整图例位置、添加网格,提升图表的可读性和美观度。
内容的提问来源于stack exchange,提问作者J Paul
相关产品推荐
相关产品推荐

