Matlab绘制多组不同起止时间戳的时间序列图技术求助
解决同图绘制20组不同起止时间戳时间序列的问题
我帮你调整并优化代码,搞定在单张图里绘制20组带不同起止时间戳的时间序列的需求,先梳理原代码里的几个小问题,再给出可直接运行的优化版本:
原代码存在的问题
linspecer(12,'qualitative')只能生成12种定性颜色,没法满足20组序列的区分需求,而且代码里的N没定义,mod(j,N)会直接报错- 循环逻辑可能不符合你的实际需求:原代码外层遍历6个起止区间,内层遍历20个序列,会把所有序列在每个区间都画一遍,而不是每个序列对应专属的起止区间
startidx里的0索引在MATLAB中会报错,MATLAB数组索引是从1开始的
优化后的代码
假设你需要20组序列各自对应一组专属的起止时间戳,以下是修正后的代码:
% 定义20组起止时间戳(示例值,可根据你的实际数据修改) startidx = randi([1, 200], 1, 20); % 随机生成20个起始索引(范围1到200) endidx = startidx + randi([10, 40], 1, 20); % 对应生成结束索引,确保end > start endidx(endidx > 250) = 250; % 防止索引超出Y的列数250 % 生成20种不同的颜色(用MATLAB自带的tab20色图,刚好20种区分度不错的颜色) colors = colormap(tab20); % Y为20×250矩阵,每行对应一个时间序列(假设你已经提前定义好Y) % Y = rand(20,250); % 如果你需要测试,可以用这行生成随机测试矩阵 figure; hold on; grid on; % 可选,添加网格会让图更易读 for k = 1:size(Y, 1) % 绘制第k个序列,从它对应的startidx(k)到endidx(k) plot(Y(k, startidx(k):endidx(k)), 'Color', colors(k, :), 'LineWidth', 1.2); end % 设置x轴范围覆盖整个时间序列的长度 xlim([1, size(Y, 2)]); xlabel('时间戳'); ylabel('序列值'); title('20组不同起止时间戳的时间序列'); hold off;
如果你实际需求是在6个不同的时间区间里分别绘制20组序列,可以用这个调整版本:
% 修正原有的6组起止区间(把0改成1,符合MATLAB索引规则) startidx = [1 9 20 64 115 160]; endidx = [9 20 64 115 160 250]; % 生成足够的颜色:用tab20c色图,20种颜色重复使用也能区分不同序列 colors = colormap(tab20c); Y = rand(20,250); % 测试用的随机矩阵,可替换成你的实际数据 figure; hold on; grid on; for j = 1:size(startidx, 2) for k = 1:size(Y, 1) % 给每个序列分配唯一颜色,超出20种就循环使用 coloridx = mod(k-1, size(colors,1)) + 1; plot(Y(k, startidx(j):endidx(j)), 'Color', colors(coloridx, :), 'LineWidth', 1); end end xlim([1, size(Y, 2)]); xlabel('时间戳'); ylabel('序列值'); title('多区间下的20组时间序列'); hold off;
关键说明
- 用MATLAB自带的
tab20/tab20c色图,不用依赖第三方工具linspecer就能拿到足够的区分色 - 所有索引都从1开始,严格遵循MATLAB的数组索引规则
- 你还可以通过添加图例(
legend)、调整线条样式等方式,进一步提升图的可读性
内容的提问来源于stack exchange,提问作者Anika Tabassum
相关产品推荐
相关产品推荐

