How do I change the number of axis ticks while using 'datetick' (Object Oriented Programming, Creating an Application)

31 次查看(过去 30 天)
I am working on a project that takes the data for the number of COVID-19 Deaths and Cases in all countries/state/regions of the globe, and puts them into a application that shows this information graphically (complete with widgets and all) using MATLAB's App Designer, an acompanying data file, and a classdef .m file to prepare the data. The project and all the widgets work perfectly, however the way I have set up the x-axis lable seems to be in error. The final plot should look something like this:
with monthly x-axis tick lables in the form of (mm/dd). However, when I run my appliation, my output is this (data has changed slightly, so only focus on number of x-axis ticks):
with a quarterly tick seperation instead of a monthly one. I dont want to send the entire code, so I know you wont be able to run the application, but I know that all the code leading to this point is correct I am just strugling with finding a way to alter the number of axis ticks. Below is what I beleive is the necessary code for the situation, if more is needed, please dont heasitate to ask for it and I can send through a less public medium.
This code is at the end of my 'Plot Data' method section (after all of the data has been plotted
xlim(app.UIAxes,[app.xDATA(1) app.xDATA(end)]);
xlim(app.UIAxes,'manual');
app.UIAxes.YLimMode = 'auto';
app.UIAxes.YTickMode = 'auto';
datetick(app.UIAxes,'x','mm/dd',"keeplimits");
grid(app.UIAxes,'on');
set(app.UIAxes,'YTickLabel',num2str(get(app.UIAxes,'YTick').','%.f'));
hold(app.UIAxes,'off');
This is the code in my start-up function that takes the data from my classdef and initiates it.
globalDATA = DATA('Global'); % DATA import
app.CountryListBox.Items = (unique(globalDATA.COUNTRY,'stable')); % Settings for items listed in the Country list box
app.StateorRegionListBox.Items = (unique(globalDATA.STATE,'stable')); % Settings for items listed in the State/Region List box
app.cases_deaths_MATRIX = globalDATA.Cases_Deaths_GLOBAL;
app.casesVEC = app.cases_deaths_MATRIX(1,:);
app.deathsVEC = app.cases_deaths_MATRIX(2,:);
startDATE = datenum(globalDATA.DATE{1});
endDATE = datenum(globalDATA.DATE{end});
app.xDATA = linspace(startDATE,endDATE,length(globalDATA.DATE));
app.averagingWINDOW = app.AveragedofDaysSlider.Value;
app.StateorRegionListBoxValueChanged;
I appreciate any help that is able to be offered, thank you in advance for your time and assistance.

采纳的回答

Dave B
Dave B 2021-11-4
Cool looking app!
One strategy is to set the ticks and then use the keepticks flag:
xdata=datenum(2020,1:4,1);
ydata=rand(1,4);
ax=nexttile;plot(xdata,ydata)
nticks = 4;
xticks(ax,linspace(xdata(1),xdata(end),nticks))
datetick(ax,'x','mm/dd',"keepticks");
ax=nexttile;plot(xdata,ydata)
nticks = 8;
xticks(ax,linspace(xdata(1),xdata(end),nticks))
datetick(ax,'x','mm/dd',"keepticks");
ax=nexttile;plot(xdata,ydata)
nticks = 12;
xticks(ax,linspace(xdata(1),xdata(end),nticks))
datetick(ax,'x','mm/dd',"keepticks");
But if you can use datetime instead of datenum, you might find that options are more flexible (with xtickformat) and you get better ticks:
figure
xdata=datetime(xdata,'ConvertFrom','datenum');
ax=nexttile;plot(xdata,ydata)
nticks = 4;
xticks(ax,linspace(xdata(1),xdata(end),nticks))
ax=nexttile;plot(xdata,ydata)
nticks = 8;
xticks(ax,linspace(xdata(1),xdata(end),nticks))
ax=nexttile;plot(xdata,ydata)
nticks = 12;
xticks(ax,linspace(xdata(1),xdata(end),nticks))
ax=nexttile;plot(xdata,ydata)
nticks = 12;
xticks(ax,linspace(xdata(1),xdata(end),nticks))
xtickformat('MMM dd')
  11 个评论

请先登录,再进行评论。

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 MATLAB 的更多信息

Community Treasure Hunt

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

Start Hunting!

Translated by