MATLAB中如何添加与时间对应的多层X轴?
问题描述
- 现有三个时间序列数据:Var1、Var2、Var3,三者起止时间完全一致但数据长度不同
- 当前用
plot(Time4Var1, Var1)绘制Var1,需要在主坐标轴下方添加新的x坐标轴,使新轴的刻度与对应变量(如Var2)的时间值精准匹配 - 此前参考的代码仅适用于数值型升降序变量,导致时间刻度对应错误,使用MATLAB R2020b版本
示例数据生成代码
clc; clear; close all; % 生成Var1的时间序列(秒级采样) Time4Var1 = (datetime(2021,11,24,1,4,0:60000))'; xx = (linspace(2,65,length(Time4Var1)))'; Var1 = sin(xx).*log(xx).*tand(xx); % 生成Var2的时间序列(25分钟间隔采样) Time4Var2 = datetime(2021,11,24,1, (4:25:1010)', 00); Var2 = bessely(1,linspace(2,23,length(Time4Var2)))'; % 生成Var3的时间序列(50分钟间隔采样) Time4Var3 = datetime(2021,11,24,1,(4:50:1009)', 00); Var3 = logspace(1,1.32,length(Time4Var3))'; % 原始叠加绘图(无额外坐标轴) figure('Units','normalized','OuterPosition',[0 0 1 1]) plot(Time4Var1,Var1) hold on plot(Time4Var3,Var3) plot(Time4Var2,Var2) hold off title('所有数据起止时间一致','FontSize',18) axis tight
错误尝试代码(问题分析)
figure('Units','normalized','OuterPosition',[0 0 1 1]) b=axes('Position',[.1 .1 .8 1e-12]); set(b,'Units','normalized'); a=axes('Position',[.1 .2 .8 .7]); set(a,'Units','normalized'); plot(a,Time4Var1,Var1) set(b,'xlim',[min(Var2) max(Var2)]); % 错误:将新轴范围设为Var2的数值,未关联时间 xlabel(a,'time') xlabel(b,'Var2') title('错误示例:新轴未关联时间刻度')
问题核心:错误地将辅助轴的x范围绑定到Var2的数值范围,而非对应的时间序列,导致时间刻度完全错位。
正确实现方法
核心思路:利用datenum将datetime类型转换为MATLAB坐标轴可识别的数值,确保主、辅轴的时间范围完全对齐,再手动设置辅助轴的刻度位置与标签。
clc; clear; close all; % ---------------------- 1. 生成数据(同示例代码) ---------------------- Time4Var1 = (datetime(2021,11,24,1,4,0:60000))'; xx = (linspace(2,65,length(Time4Var1)))'; Var1 = sin(xx).*log(xx).*tand(xx); Time4Var2 = datetime(2021,11,24,1, (4:25:1010)', 00); Var2 = bessely(1,linspace(2,23,length(Time4Var2)))'; Time4Var3 = datetime(2021,11,24,1,(4:50:1009)', 00); Var3 = logspace(1,1.32,length(Time4Var3))'; % ---------------------- 2. 创建主坐标轴与绘图 ---------------------- figure('Units','normalized','OuterPosition',[0 0 1 1]) % 主坐标轴:绘制Var1,x轴为时间 ax_main = axes('Position', [0.1 0.2 0.8 0.7], 'Units', 'normalized'); plot(ax_main, Time4Var1, Var1, 'LineWidth', 1.5); hold(ax_main, 'on'); plot(ax_main, Time4Var3, Var3, 'ro-', 'LineWidth', 1); plot(ax_main, Time4Var2, Var2, 'bs-', 'LineWidth', 1); hold(ax_main, 'off'); title(ax_main, '主图+下方时间辅助轴', 'FontSize', 18); xlabel(ax_main, '主时间轴(秒级)', 'FontSize', 12); ylabel(ax_main, '变量值', 'FontSize', 12); axis(ax_main, 'tight'); % ---------------------- 3. 创建下方辅助时间轴 ---------------------- % 辅助坐标轴:仅显示x轴,位置在主轴下方 ax_aux = axes('Position', [0.1 0.1 0.8 0.05], 'Units', 'normalized'); % 关闭辅助轴的y轴(不需要显示) set(ax_aux, 'YColor', 'none', 'YTick', []); % 将辅助轴的x范围与主轴的时间范围对齐(用datenum转换为数值) time_min = datenum(Time4Var1(1)); time_max = datenum(Time4Var1(end)); set(ax_aux, 'XLim', [time_min, time_max]); % 设置辅助轴的刻度位置为Var2的时间点(转成datenum),刻度标签为格式化时间 tick_positions = datenum(Time4Var2); tick_labels = datestr(Time4Var2, 'HH:mm'); % 自定义时间格式,比如'yyyy-mm-dd HH:mm' set(ax_aux, 'XTick', tick_positions, 'XTickLabel', tick_labels); xlabel(ax_aux, 'Var2时间轴(25分钟间隔)', 'FontSize', 12); % 确保辅助轴的x轴方向与主轴一致 set(ax_aux, 'XDir', 'normal');
关键说明
- 时间对齐核心:通过
datenum将datetime转换为数值,确保主、辅轴的x范围完全匹配,避免时间刻度错位 - 刻度自定义:手动指定辅助轴的刻度位置(对应Var2的每个时间点)和标签(格式化后的时间文本),精准匹配变量的采样时间
- R2020b兼容性:代码完全兼容MATLAB R2020b版本,无需依赖高版本函数
内容的提问来源于stack exchange,提问作者sreeraj t
相关产品推荐
相关产品推荐

