使用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
相关产品推荐
相关产品推荐

