我有一个包含两列数据的矩阵。第一列具有在UNIX时间内给出的时间戳,第二列具有相应的数据集。
我试图在底部轴上以人类可读的时间绘制此DATA
。
我已经绘制了原始数据,如下所示:
plot(DATA(:,1), DATA(:,2));
我知道MATLAB中有一个timeseries()
函数,但我似乎无法正常工作。我应该能够绘制数据following the MATLAB documentation。
我已尝试将第一列声明为时间序列:
TS = timeseries(DATA(:,1));
然后我尝试绘制数据,如下:
plot(TS, DATA(:,1));
虽然这种方法似乎有道理,但我得到以下错误:
使用绘图时出错 数据必须是单个矩阵Y或X,Y
对的列表
我还尝试使用addsample()
函数将数据附加到时间序列,然后绘制它。
K = addsample(TS, DATA(:,2));
plot(K);
但这样做会产生以下错误:
必须将新样本指定为结构或属性 - 值对。
那么如何正确绘制这段时间数据呢?谢谢!
答案 0 :(得分:2)
我经常使用posix
时间(即unixtime
)与其他程序一起工作,但在matlab中,处理时间和日期的最简单格式是Matlab时间序列号格式。
要从Unix
转换为Matlab
,我会广泛使用小型转化功能:
function matlabtime = unix2matlabtime(unixtime)
%// function matlabtime = unix2matlabtime(unixtime)
%//
%// input : ** unixtime ** : time vector in the UNIX time serial number
%// representation (seconds since 01-jan-1970)
%//
%// output : ** matlabtime ** : time vector in the Matlab time serial number
%// representation (days since 01-jan-0000)
pivot = datenum([1970 01 01 00 00 00]) ;
matlabtime = ( unixtime / 24 / 3600 ) + pivot ;
将此功能保存在路径的某个位置,您可以如下绘制数据:
%// Generate sample data
sampleunixtime = linspace( 1427205640 , 1427205900 ).' ; %'// ignore this comment
DATA = [sampleunixtime , sin(sampleunixtime./10) ] ;
%// get a time vector in Matlab time serial format, then plot
time = unix2matlabtime( DATA(:,1) ) ;
plot( time, DATA(:,2) )
%// Adjust X-Ticks in human readable format
set( gca , 'XTickLabel' , datestr( get(gca,'XTick'),'HH:MM:SS' ) )
获取:
查看datenum
和datestr
文档,了解如何处理这些问题。日期/时间有许多预定义的输出格式,或者您甚至可以构建自己的格式以提高所需的精度(添加毫秒,删除秒,添加日期等...)。
请注意,XTickLabel
现在已被覆盖,因此不会自动更新。因此,如果您在数字上zoom
或pan
,则必须重新运行最后一行代码以刷新XTicks
值。
(就个人而言,我将最后一行代码放在Matlab工具栏快捷方式中,以便随时快速访问。)