cut out section of x axis

102 views (last 30 days)
Heidi Hirsh
Heidi Hirsh on 4 Sep 2019
Answered: Kelly Kearney on 4 Sep 2019
I am plotting two experiments on the same x axis. I want to keep the xaxis from 7/11 to 7/14 and 7/18 to 7/20, but I want to cut out the space inbetween (7/14 to 7/18). Is this possible.
This is my figure code now:
f1 = figure(1)
subplot(2,1,1)
hold on
plot(time_hr,ph_hr(1,:),'o','color','r','markersize',3);
plot(time_hr,ph_hr(2,:),'o','color',[1.0 .6 0.0],'markersize',3);
plot(time_hr,ph_hr(3,:),'o','color',[0 .4 .2],'markersize',3);
plot(time_hr,ph_hr(4,:),'o','color',[0 .6 1],'markersize',3);
plot(time_hr,ph_hr(5,:),'o','color',[.2 0 .6],'markersize',3);
% plot(MX,PK.PH(2,:),'color',[0 .4 .2])
% plot(MX,PK.PH(8,:),'color',[.2 0 .6])
set(gca,'fontsize', 16)
ylabel('pH')
title('HR2 and HR3')
x = datenum('July-11-2018'):1:datenum('July-20-2018');
xx = datenum('July-11-2018'):.25:datenum('July-20-2018');
set(gca,'XTick', x);
ax=gca;
ax.XAxis.MinorTick = 'on'
ax.XAxis.MinorTickValues = xx
datetick('x','mm/dd','keepticks')
xlim([datenum('July-11-2018 00:00') datenum('July-20-2018 00:00')]);
subplot(2,1,2)
hold on
plot(time_hr,temp_hr(1,:),'o','color','r','markersize',3);
plot(time_hr,temp_hr(2,:),'o','color',[1.0 .6 0.0],'markersize',3);
plot(time_hr,temp_hr(3,:),'o','color',[0 .4 .2],'markersize',3);
plot(time_hr,temp_hr(4,:),'o','color',[0 .6 1],'markersize',3);
plot(time_hr,temp_hr(5,:),'o','color',[.2 0 .6],'markersize',3);
% plot(MX,PK.TEMP(2,:),'color',[0 .4 .2])
% plot(MX,PK.TEMP(8,:),'color',[.2 0 .6])
set(gca,'fontsize', 16)
ylabel('Temperature \circC')
x = datenum('July-11-2018'):1:datenum('July-20-2018');
xx = datenum('July-11-2018'):.25:datenum('July-20-2018');
set(gca,'XTick', x);
ax=gca;
ax.XAxis.MinorTick = 'on'
ax.XAxis.MinorTickValues = xx
datetick('x','mm/dd','keepticks')
xlim([datenum('July-11-2018 00:00') datenum('July-20-2018 00:00')]);
  4 Comments
darova
darova on 4 Sep 2019
Can't you just move your data (see attached file)?
Or you want to change x ticks too?
Heidi Hirsh
Heidi Hirsh on 4 Sep 2019
I think what I am trying to do is called breaking the x axis (so it skips the time with no data).

Sign in to comment.

Accepted Answer

Adam Danz
Adam Danz on 4 Sep 2019
This solution identifies all data with dates past 7/18 and shifts them down by 5 days. Then it overrides the x ticks with custom xticklabels.
load('data.mat')
% define gap boundaries
bounds = datenum({'07/14/2018','07/18/2018'}); %[start,stop] of gap
% shift data that are beyond bound to the start of the bound
shift = range(bounds);
time_hr_altered = time_hr - (time_hr >= bounds(2))*shift;
f1 = figure(1)
subplot(2,1,1)
hold on
plot(time_hr_altered,ph_hr(1,:),'o','color','r','markersize',3);
plot(time_hr_altered,ph_hr(2,:),'o','color',[1.0 .6 0.0],'markersize',3);
plot(time_hr_altered,ph_hr(3,:),'o','color',[0 .4 .2],'markersize',3);
plot(time_hr_altered,ph_hr(4,:),'o','color',[0 .6 1],'markersize',3);
plot(time_hr_altered,ph_hr(5,:),'o','color',[.2 0 .6],'markersize',3);
% Set up daily ticks
xtic = floor(min(time_hr_altered)) : ceil(max(time_hr_altered));
xtic_altered = xtic + (xtic >= bounds(1))*shift;
xticLabels = datestr(xtic_altered, 'mm/dd');
set(gca,'XTick', xtic, 'XTickLabel', xticLabels);
% Draw vertical reference line where the dates are discontinuous
plot(bounds([1,1]), [min(ylim),max(ylim)], 'k--'); %use xline() if r2018b or later
190904 165507-Figure 1.jpg
  2 Comments
Heidi Hirsh
Heidi Hirsh on 4 Sep 2019
I see! This will work for what I need. Thank you!
Do you know if I could do a break like this function does while plotting more than one set of (x,y)?
Adam Danz
Adam Danz on 4 Sep 2019
I haven't used that function so I'm not sure what it does.
The demo in my answer plots more than one set of (x,y) so I'm not sure what you're asking.
If you want to add the "//" to the top and bottom of the axes,
ylim(ylim()); %set y ax lim so it doesn't change
text(xtic(xtic == bounds(1)), min(ylim()), '//','fontsize',15,'HorizontalAlignment', 'center')
text(xtic(xtic == bounds(1)), max(ylim()), '//','fontsize',15,'HorizontalAlignment', 'center')

Sign in to comment.

More Answers (1)

Kelly Kearney
Kelly Kearney on 4 Sep 2019
Rather than shifting data and manually overriding tick labels, I prefer to use multiple axes to achieve breaks like this. The advantage is that you don't have to make any modifications to your data, and all plot types are supported.
dt = hours(1);
t = [datetime(2019,7,11):dt:datetime(2019,7,14) datetime(2019,7,18):dt:datetime(2019,7,21)];
y = rand(length(t), 5);
tlim(1,:) = [datetime(2019,7,11) datetime(2019,7,14)];
tlim(2,:) = [datetime(2019,7,18) datetime(2019,7,21)];
dt = tlim(:,2) - tlim(:,1);
% Create two axes, right next to each other. The size of each
% matches the time interval to be plotted on each.
frac = dt./sum(dt);
dx = 0.8;
ax(1) = axes('position', [0.1 0.1 dx*frac(1) 0.8]);
ax(2) = axes('position', [0.1+frac(1)*dx 0.1 dx*frac(2) 0.8]);
% Plot the same data to both axes
for ii = 1:2
plot(ax(ii), t,y, 'o');
end
% Adjust axis limits so each axis shows a portion of the data.
% Also, turn off the color of the right y-axis so it looks
% like one continuous axis
set(ax, 'ylim', [0 1]);
set(ax(1), 'xlim', tlim(1,:), 'box', 'off');
set(ax(2), 'xlim', tlim(2,:), 'box', 'off', 'ycolor', 'none');
I've used datetimes in this example; the same technique will work with datenum and datetick if you have an older version of Matlab. Also, if you have an older version, you may have to settle for matching the color of the y-axis to the axis color (by default, white), since 'none' wasn't an option.

Community Treasure Hunt

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

Start Hunting!