赞
踩
可能新学matlab的同学能够很熟练的掌握这个技能,但作为matlab陈旧用户,我还是相当不思进取的。能用旧知识解决的问题,不愿意学新知识。比如从fortran来的用户,进了matlab不稀罕矩阵操作,matlab6.5开始用户,拒绝新的数据结构。也难怪老板们喜新厌旧。说正事。
matlab从2016b版本引入了timetable这个数据类型,table的类型好像更早一点,但作为跟数字打交道的学科,对table无感。从2018b版本又引入了stackedplot这个交互式的绘图方式。我嘛,从2021年5月,才第一次听说stackedplot。
对于经常与时间序列数据打交道的用户来说,掌握这两个工具还是很有意义的。
在此不给出完整可运行的代码,仅以概念为例吧,具体内容还请移步matlab help文件查询,以及B站一个小讲座https://www.bilibili.com/video/BV17o4y1D7Km。对于这个视频,我只能说相见恨晚,跟doc文件死去活来的搞懂之后的3个月才被我发现。便宜你们了。
stackedplot(timetbl),可以实现如下的交互绘图,x轴有相应的时间戳,鼠标停留的位置也可以直接提示时间,及每根线对应的数值。能够十分简便的观察手头的时间序列数据以及数据直接的关系。
timetbl就是我们提到的timetable数据。
利用滚轮缩放,时间戳也会相应缩放
鼠标停留,可以提示时间、及各变量的对应数值
timetable数据在matlab变量栏里,可以看到包含第一个时间项,后面就是其他各数据,如果没有命名,默认是variable1 variable2,。。。variableN。如果有命名,就是图中这样。每个数据的名字也会在图中显示出来。
看到这里应该已经心动了吧,下面就是如何把手头的数据造为timetable格式
首先,timetable的时间为datetime格式,如果已有数据是自带时间的,可以读入matlab,并通过matlab默认的datetime、datenum、datevec、datestr等函数,转换为datetime格式。不会请查doc。matlab对时间的互相转换十分灵活,有需要的朋友最好掌握。如果已有数据的采样间隔是规律的,也可以自造time。
- tt0 = datetime(1951,1,1,0,0,0);
- tt1 = datetime(2021,7,31,23,0,0,0);
- step = hours(6);
- time = tt0:step:tt1;
- time = time(:);
- tnum = datenum(time);
这里的time,就是数据格式是datetime。tnum是普通的double数组,也是matlab早期的datenumber 可以跟datetick配合使用。比如
- plot(tnum,variable1)
- datetick x
x轴就会变成实际时间啦。
有了time之后,按照如下方式构建timetable数据,并用stackedplot绘制出来
- tbl = table;
- tbl.Time = time;
- tbl.Var1 = x1;
- tbl.Var2 = x2;
- ...
- tbl.VarN = xN;
- timetbl = table2timetable(tbl);
- ss = stackedplot(timetbl);
- ss.LineWidth = 1.5;
- ss.FontName = 'Yahei';
- ss.FontSize = 15;
- % ss.AxesProperties(1).YLimits = [ylim1, ylim2];
- % ss.AxesProperties(2).YLimits = PitchLimits;
- % ss.AxesProperties(3).YLimits = RollLimits;
Var1 Var2 VarN就是各个变量的名字,可以自由定义。注意的是,time,x1, x2 xN的数据长度是一致的。对图的装饰也请参考
以上是暂时摸索到的timetalbe构造及绘制的主要流程,供参考。
timetable还有很多强大的功能,合并、归类、整理等等,暂时都还没学会,。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。