You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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');

关键说明

  1. 时间对齐核心:通过datenum将datetime转换为数值,确保主、辅轴的x范围完全匹配,避免时间刻度错位
  2. 刻度自定义:手动指定辅助轴的刻度位置(对应Var2的每个时间点)和标签(格式化后的时间文本),精准匹配变量的采样时间
  3. R2020b兼容性:代码完全兼容MATLAB R2020b版本,无需依赖高版本函数

内容的提问来源于stack exchange,提问作者sreeraj t

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 15:05:03