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

使用plotyy绘图无法显示xgrid与ygrid网格线问题排查

问题分析与解决方案

你的代码网格不显示的核心原因有两个:

  • 调用datetick后手动覆盖xtick,破坏了日期刻度与网格的关联;
  • 双轴场景下重复设置两个轴的x网格,且未处理轴的层级遮挡问题。

修改后的代码(关键部分标注)

clear();
close all;

#Package to load csv files
pkg load io;

#conv from MJD to JD
function JD = fromMJDtoJD(MJD)
  JD = (MJD + 2400000.5);
endfunction

#Conv from JD to UTC
function Datte = fromJDtoUTC(JD)
   ZeroJD  = datenum (-4713,11,24,12,0,0);
   Days = ZeroJD + JD ;
   Datte = datevec(Days);
endfunction

#Conv from MJD to UTC
function UTCDate = fromMJDtoUTC(MJD)
  UTCDate = fromJDtoUTC(fromMJDtoJD(MJD));
endfunction


#Load csv file
[nombreFicheroCSV, pathFicheroCSV]=uigetfile("*.csv");
nombreCompletoCSV = fullfile (pathFicheroCSV, nombreFicheroCSV);
ficheroCSV=csv2cell(nombreCompletoCSV, ",");

#gets columns data (without header, first row)
MJD_days = cell2mat(ficheroCSV(2:end,1));
Pos_cts = cell2mat(ficheroCSV (2:end,2));
Error_cts = cell2mat(ficheroCSV (2:end,3));
Current_ma = cell2mat(ficheroCSV (2:end,4));
RDY = ficheroCSV (2:end,5);
ENA = ficheroCSV (2:end,6);
HOK = ficheroCSV (2:end,7);
IMV = ficheroCSV (2:end,8);
HTD = ficheroCSV (2:end,9);
BRK = ficheroCSV (2:end,10);

#conv MJD column from MJD to UTC using the custom function
[nr,nc]=size(MJD_days);
timeFormat = 'dd-mmm-yyyy HH:MM:SS';
for f = 1:nr,
  aux = datestr(fromMJDtoUTC(MJD_days(f)));
  UTC_days (f)= datenum(aux,timeFormat);
end

#row to column
UTC_days=UTC_days';

%Plot axis
[ax,h1,h2]=plotyy(UTC_days,Current_ma,UTC_days,Pos_cts);

set(h1,'color','g','Marker','.');
set(h2,'color','r','Marker','.')

% --- 关键修改1:先设置网格,再调用datetick,且仅启用底层轴的x网格 ---
% 启用x网格(仅ax(1),因为双轴共享x轴,ax(2)的x轴默认隐藏)
set(ax(1), 'xgrid', 'on', 'gridlinestyle', '--', 'gridcolor', [0.7 0.7 0.7]);
% 启用两个轴的y网格
set(ax(1), 'ygrid', 'on', 'gridlinestyle', '--', 'gridcolor', [0.7 0.7 0.7]);
set(ax(2), 'ygrid', 'on', 'gridlinestyle', '--', 'gridcolor', [0.7 0.7 0.7]);

% --- 关键修改2:让datetick自动处理刻度,不要手动覆盖xtick ---
datetick(ax(1),'x',timeFormat,'keepticks');
% 无需给ax(2)设置datetick,因为x轴共享,重复设置会干扰网格

% --- 若需要自定义刻度密度,用datetick的参数调整,而非手动设xtick ---
% 例如:datetick(ax(1),'x',timeFormat,'keepticks','tickdir','out','n',10);

% --- 可选:调整轴层级,避免网格被遮挡 ---
set(ax(2), 'layer', 'top');

核心修改点说明

  • 调整操作顺序:先启用网格,再调用datetick,确保日期刻度与网格的关联不被破坏;
  • 简化x网格设置:双轴共享x轴,只需启用底层轴(ax(1))的x网格即可,ax(2)的x轴默认隐藏,设置它的网格不会显示;
  • 取消重复的datetick调用:无需给ax(2)设置x轴日期刻度,避免干扰网格渲染;
  • 避免手动覆盖xtick:如果需要调整刻度密度,直接用datetick的'n'参数指定刻度数量(比如'n',10表示显示10个刻度),不要手动设置xtick;
  • 可选:调整轴层级:设置ax(2)的layer为top,确保右侧y轴的网格和线条不会被左侧轴遮挡。

内容的提问来源于stack exchange,提问作者Sergio Rueda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 15:43:17