【MATLAB第11期】#源码分享 |时间序列数据绘图,横坐标更改为时间轴 横坐标轴参数更改
绘图问题解决方案
修改前
修改后
1、导入数据方式(识别时间数据)
我们知道xlsread函数无法导入时间数据,会自动删除时间数据
导入时间数据,一般需要学习以下几个函数:
(1)importdata函数
(2)readtable函数
(3)其他方法(如双击EXCEL数据,直接界面导入对应格式数据)
2、案例展示
本次展示的是readtable函数,即把double数据转化为table表格数据。
(1)打开数据
T = readtable('data.xlsx'); %打开data数据
readtable有个缺点是导入的数据标题会系统默认。
进阶学习可以了解detectImportOptions函数,可以人工修改标题。
(2)定义时间和数据
data=table2array(T(:,2)); time=table2array(T(:,1));
需要将table数据转为double数据 ,需要用table2array函数。时间数据自动转化为datetime时间格式
(3)将时间数据转化为数值
x = datenum(time) ;
datenum函数很关键 。一般绘图,横坐标为转化后的数值,纵坐标为对应数据
(4)绘图
datetick('x','yyyy-mm-dd');% 这里可以替换 datetick('x', 20);
时间格式yyyy-mm-dd自己定义,如年月可以为’yyyy-mm’
加上小时的话 ,可以私下学习一下datetick函数~
set(gca,'XTick',x(1:1:size(x,1)))
这里是设置横坐标的间隔,可以防止时间太多,横坐标装不下去。 所以可以设置对应间隔,如1:5:N
set(gca,'XTickLabel',datestr(x(1:1:size(x,1)),'yyyy-mm-dd') )
这里是设置横坐标时间的标签,与上面相同,间隔保持一致。
绘图代码如下:
figure() plot(x,data,'-ob','LineWidth',0.5); % datetick('x', 'yyyy-mm-dd');% 这里可以替换 datetick('x', 20); set(gca,'XTick',x(1:1:size(x,1))) set(gca,'XTickLabel',datestr(x(1:1:size(x,1)),'yyyy-mm-dd') ) grid on axis tight; xlabel("日期") ylabel("值") title("绘图结果 ")
完整代码
clc,clear; % importdata %opts = detectImportOptions('data.xlsx') %opts.VariableNames=[{ '时间'} ,{'数量'}] T = readtable('data.xlsx'); data=table2array(T(:,2)); time=table2array(T(:,1)); x = datenum(time) ; %new_x=x(1):x(end); figure() plot(x,data,'-ob','LineWidth',0.5); datetick('x', 'yyyy-mm-dd'); set(gca,'XTick',x(1:1:size(x,1))) set(gca,'XTickLabel',datestr(x(1:1:size(x,1)),'yyyy-mm-dd') ) grid on axis tight; xlabel("日期") ylabel("值") title("绘图结果 ")