when datenum is the x-axis How to change the x-axis to discernable time

9 views (last 30 days)
I have a five-year water level data. On the x-axis, I use datenum to convert the time into numbers so that I can draw the graph, but the x-axis is the value of datenum when it is represented. I would like to ask if there is any way to rotate the x-axis. Available year and month
ex:
i have water level data 2000 - 2005
I want to display on the x-axis 2000/01 2000/02...2000/12 2001/1...2000/12...2002/1.....2005/12
There are twelve divisions between years
  2 Comments
Walter Roberson
Walter Roberson on 18 May 2022
There are ways to rotate the x tick labels, but the ease of doing that depends on how old your MATLAB version is. The fact that you are using datenum for this work suggests that you might be using r2015b or earlier; as the details were changing a fair bit back then, we would need to know exactly which release.
These days in modern MATLAB this is something that is easy to do, if you use datetime objects instead of datenum. If you have the option of using datetime() then we recommend that you do that.
dpb
dpb on 18 May 2022
Edited: dpb on 18 May 2022
As @Walter Roberson suggests, if your can, use datetime instead and you'll get the date strings on the axis automagically. With datenum, there's a corollary function datetick that will let you set the date string format as you want it --it's somewhat klunky, but it does work.
I would suggest that with six years of data you simply do not have sufficient room for labelled ticks every month; that's 72 ticks which would be difficult even without the length of a date string to display, rotated or not. I'd suggest cutting the number by at least half; it may be convenient that 12 is also divisible by 3 or 4.
If you do/can go with the datetime instead, it's likely the auto tick labels will separate the year from the date string portion at the tick location and place it like a multiplier on a numeric axis to gain the extra room.

Sign in to comment.

Answers (1)

dpb
dpb on 18 May 2022
Edited: dpb on 18 May 2022
On an assumption you can use datetime
t=datetime(2000,1,1):days(1):datetime(2000,1,1)+calyears(6); % build daily time vector over your range
plot(t,randn(size(t))) % plot against it w/ datetime
xtk=xticks; % get the default axis tick values
xtk=xtk(1):calmonths(1):xtk(end); % make a new set by month
hAx=gca; % the axes handle
hAx.XTickLabelRotation=45; % set the rotation
hAx.XAxis.TickLabelFormat='u/MM'; % your desired format for tick labels
This produces with default figure size the following --
You see there simply isn't enough room physically for that many tick labels -- even if you enlarge the figure, unless it's full screen it's going to be too busy to lookd good.
ADDENDUM:
Just for good measure in case @Walter Roberson's fear is correct, to do the same with datenum would look something like
t=datenum(2000,1,1):datenum(2006,1,1); % days are integer portion of datenum
plot(t,randn(size(t))) % plot against datenum instead
xtk=cell2mat(arrayfun(@(y)eomday(y,1:12),2000:2005,'UniformOutput',false)); % days in month for each year
xticks([t(1) t(1)+cumsum(dtk)]) % set ticks at one-month
datetick('x','yyyy/mm','keepticks','keeplimits') % show as date strings
hAx=gca; % rotate the labels
hAx.XTickLabelRotation=45;
Looks the same, you'll want to only use every second or third tick...
With datetime axis, you can just reset the tick spacing and the tick labels will update to match; if you are forced or choose to use datenum, then
xtk=xticks; % retrieve present tick values
xticks(xtk(1:3:end)) % use quarterly (every three months)
datetick('x','yyyy/mm','keepticks','keeplimints') % MUST CALL AGAIN!!!
hAx.XAxis.FontSize=8; % will help legibility, too, probably
  5 Comments
Walter Roberson
Walter Roberson on 19 May 2022
The file exchange contribution I am thinking of reads the current tick labels, deletes them, and text() copies with rotation, if I recall correctly . There was something about the way that the tick labels were managed that was not compatible with just setting rotation, but the details do not come to mind now. It had the usual drawbacks that on resize or pan or adding more data that you wanted to have trigger new labels, you had to redraw the labels.
dpb
dpb on 20 May 2022
Yeah, the above is the barebones outline of what a user function would have to do -- to make it work at all well would need to also tie in with callback functions to redraw -- and not sure if can trigger callbacks on all events that would need it...

Sign in to comment.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!