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

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

代码解释

  1. 数据结构化:用struct打包每组的时间和数据,让代码结构更清晰整洁。
  2. 函数复用:将时间转换和归一化逻辑封装成独立函数,避免重复编写相同代码,同时便于后续修改维护。
  3. 正确归一化:每组时间轴基于自身起始点计算偏移,确保所有组的X轴零点对应各自实验开始,彻底解决原代码的逻辑错误。
  4. 绘图优化:设置白色背景、调整图例位置、添加网格,提升图表的可读性和美观度。

内容的提问来源于stack exchange,提问作者J Paul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 00:27:09