Is there anyway to create a plot with a discontinued x-axis, where the one set of data is linked to the left y-axis, and a second data is linked to right y-axis?
Ältere Kommentare anzeigen
Hello,
I would like to plot 2 sets of data on the same x-axis, but the x-axis is discontinued. In the first range, R1, the x-axis should cover 0-10. In the second range, R2, the x-axis should cover 40-50. In both ranges I would like to plot y1 on the left axis, and y2 on the right axis. I used the example for Plotting Data on a Discontinuous x-Axis as a template. I can plot a discontinued x-axis with y1 in both ranges linked to the left y-axis. Please see my code below:
x_R1 = 0:10;
y1_R1 = rand(1,11)*10;
y2_R1 = rand(1,11)*100;
x_R2 = 40:50;
y1_R2 = rand(1,11)*10;
y2_R2 = rand(1,11)*100;
figure
t = tiledlayout(1,2,'TileSpacing','tight');
bgAx = axes(t,'XTick',[],'YTick',[],'Box','off');
bgAx.Layout.TileSpan = [1 2];
ax1 = axes(t);
plot(ax1,x_R1,y1_R1, 'b')
xline(ax1,10,':');
ax1.Box = 'off';
xlim(ax1,[0 10])
ax2 = axes(t);
ax2.Layout.Tile = 2;
plot(ax2,x_R2,y1_R2, 'b')
xline(ax2,40,':');
ax2.YAxis(1).Visible = 'off';
ax2.Box = 'off';
xlim(ax2,[40 50])
linkaxes([ax1 ax2], 'y')
But, when I add the second set of data, y2, using yyaxis right, the y1 data loses the link to the left y-axis. Please see below:
x_R1 = 0:10;
y1_R1 = rand(1,11)*10;
y2_R1 = rand(1,11)*100;
x_R2 = 40:50;
y1_R2 = rand(1,11)*10;
y2_R2 = rand(1,11)*100;
figure
t = tiledlayout(1,2,'TileSpacing','tight');
bgAx = axes(t,'XTick',[],'YTick',[],'Box','off');
bgAx.Layout.TileSpan = [1 2];
ax1 = axes(t);
ax1.Layout.Tile = 1;
plot(ax1,x_R1,y1_R1, 'b')
%Add right y-axis data to R1
yyaxis right
plot(ax1, x_R1,y2_R1, 'r');
%
ax1.YAxis(2).Visible = 'off';
xline(ax1,10,':');
ax1.Box = 'off';
xlim(ax1,[0 10])
ax2 = axes(t);
ax2.Layout.Tile = 2;
plot(ax2,x_R2,y1_R2, 'b')
%Add right y-axis data to R2
yyaxis right
plot(ax2, x_R2,y2_R2, 'r');
%
xline(ax2,40,':');
ax2.YAxis(1).Visible = 'off';
ax2.Box = 'off';
xlim(ax2,[40 50])
linkaxes([ax1 ax2], 'y')
Is there anyway to create this discontinued x-axis plot, where the y1 data is linked to the left y-axis, and the y2 data is linked to right y-axis?
Thank you!
5 Kommentare
I changed your values to make it easier to see what's going on, but it looks fine to me (see below). I also tested in 2022b with the same results. Can you post a screen shot of the results you're getting?
x_R1 = 0:10;
y1_R1 = 0:1:10;
y2_R1 = 100:-10:0;
x_R2 = 40:50;
y1_R2 = 10:-1:0;
y2_R2 = 0:10:100;
figure
t = tiledlayout(1,2,'TileSpacing','tight');
bgAx = axes(t,'XTick',[],'YTick',[],'Box','off');
bgAx.Layout.TileSpan = [1 2];
ax1 = axes(t);
plot(ax1,x_R1,y1_R1, 'b')
xline(ax1,10,':');
ax1.Box = 'off';
xlim(ax1,[0 10])
ax2 = axes(t);
ax2.Layout.Tile = 2;
plot(ax2,x_R2,y1_R2, 'b')
xline(ax2,40,':');
ax2.YAxis(1).Visible = 'off';
ax2.Box = 'off';
xlim(ax2,[40 50])
linkaxes([ax1 ax2], 'y')
x_R1 = 0:10;
y1_R1 = 0:1:10;
y2_R1 = 100:-10:0;
x_R2 = 40:50;
y1_R2 = 10:-1:0;
y2_R2 = 0:10:100;
figure
t = tiledlayout(1,2,'TileSpacing','tight');
bgAx = axes(t,'XTick',[],'YTick',[],'Box','off');
bgAx.Layout.TileSpan = [1 2];
ax1 = axes(t);
ax1.Layout.Tile = 1;
plot(ax1,x_R1,y1_R1, 'b')
%Add right y-axis data to R1
yyaxis right
plot(ax1, x_R1,y2_R1, 'r');
%
ax1.YAxis(2).Visible = 'off';
xline(ax1,10,':');
ax1.Box = 'off';
xlim(ax1,[0 10])
ax2 = axes(t);
ax2.Layout.Tile = 2;
plot(ax2,x_R2,y1_R2, 'b')
%Add right y-axis data to R2
yyaxis right
plot(ax2, x_R2,y2_R2, 'r');
%
xline(ax2,40,':');
ax2.YAxis(1).Visible = 'off';
ax2.Box = 'off';
xlim(ax2,[40 50])
linkaxes([ax1 ax2], 'y')
Antonio Rubio
am 23 Mär. 2023
Seems like a bug. I simplified the code for troubleshoothing and tried a few different things but didn't make any progress. Interestingly, the results are different if you call linkaxes from yyaxis left vs yyaxis right (but still not correct).
x_R1 = 0:10;
y1_R1 = 0:10;
y2_R1 = 100:-1:90;
x_R2 = 40:50;
y1_R2 = 10:20;
y2_R2 = 90:-1:80;
figure;
t = tiledlayout(1, 2);
nexttile(1)
yyaxis(nexttile(1), 'left')
plot(nexttile(1),x_R1,y1_R1, 'b')
yyaxis(nexttile(1), 'right')
plot(nexttile(1), x_R1,y2_R1, 'r');
nexttile(2)
yyaxis(nexttile(2), 'left')
plot(nexttile(2),x_R2,y1_R2, 'b')
yyaxis(nexttile(2), 'right')
plot(nexttile(2), x_R2,y2_R2, 'r');
yyaxis(nexttile(1), 'right')
linkaxes([nexttile(1) nexttile(2)], 'y')
figure;
t = tiledlayout(1, 2);
nexttile(1)
yyaxis(nexttile(1), 'left')
plot(nexttile(1),x_R1,y1_R1, 'b')
yyaxis(nexttile(1), 'right')
plot(nexttile(1), x_R1,y2_R1, 'r');
nexttile(2)
yyaxis(nexttile(2), 'left')
plot(nexttile(2),x_R2,y1_R2, 'b')
yyaxis(nexttile(2), 'right')
plot(nexttile(2), x_R2,y2_R2, 'r');
yyaxis(nexttile(1), 'left')
linkaxes([nexttile(1) nexttile(2)], 'y')
Here's an alternative approach:
x_R1 = 0:10;
y1_R1 = 0:10;
y2_R1 = 100:-1:90;
x_R2 = 40:50;
y1_R2 = 10:20;
y2_R2 = 90:-1:80;
t = tiledlayout(1, 2);
yyaxis(nexttile(1), 'left')
plot(nexttile(1),x_R1,y1_R1, 'b')
yyaxis(nexttile(1), 'right')
plot(nexttile(1), x_R1,y2_R1, 'r');
yyaxis(nexttile(2), 'left')
plot(nexttile(2),x_R2,y1_R2, 'b')
yyaxis(nexttile(2), 'right')
plot(nexttile(2), x_R2,y2_R2, 'r');
YLmin = min([nexttile(1).YAxis(1).Limits, nexttile(2).YAxis(1).Limits]);
YLmax = max([nexttile(1).YAxis(1).Limits, nexttile(2).YAxis(1).Limits]);
YRmin = min([nexttile(1).YAxis(2).Limits, nexttile(2).YAxis(2).Limits]);
YRmax = max([nexttile(1).YAxis(2).Limits, nexttile(2).YAxis(2).Limits]);
yyaxis(nexttile(1), 'left')
ylim([YLmin YLmax])
yyaxis(nexttile(1), 'right')
ylim([YRmin YRmax])
yyaxis(nexttile(2), 'left')
ylim([YLmin YLmax])
yyaxis(nexttile(2), 'right')
ylim([YRmin YRmax])
Or with your original code:
x_R1 = 0:10;
y1_R1 = 0:10;
y2_R1 = 100:-1:90;
x_R2 = 40:50;
y1_R2 = 10:20;
y2_R2 = 90:-1:80;
figure
t = tiledlayout(1,2,'TileSpacing','tight');
bgAx = axes(t,'XTick',[],'YTick',[],'Box','off');
bgAx.Layout.TileSpan = [1 2];
ax1 = axes(t);
plot(ax1,x_R1,y1_R1, 'b')
yyaxis right
plot(ax1, x_R1,y2_R1, 'r');
ax1.YAxis(2).Visible = 'off';
xline(ax1,10,':');
ax1.Box = 'off';
xlim(ax1,[0 10])
ax2 = axes(t);
ax2.Layout.Tile = 2;
plot(ax2,x_R2,y1_R2, 'b')
yyaxis right
plot(ax2, x_R2,y2_R2, 'r');
xline(ax2,40,':');
ax2.YAxis(1).Visible = 'off';
ax2.Box = 'off';
xlim(ax2,[40 50])
linkaxes([ax1 ax2], 'y')
YLmin = min([ax1.YAxis(1).Limits, ax2.YAxis(1).Limits]);
YLmax = max([ax1.YAxis(1).Limits, ax2.YAxis(1).Limits]);
YRmin = min([ax1.YAxis(2).Limits, ax2.YAxis(2).Limits]);
YRmax = max([ax1.YAxis(2).Limits, ax2.YAxis(2).Limits]);
yyaxis(ax1, 'left')
ylim([YLmin YLmax])
yyaxis(ax1, 'right')
ylim([YRmin YRmax])
yyaxis(ax2, 'left')
ylim([YLmin YLmax])
yyaxis(ax2, 'right')
ylim([YRmin YRmax])
Antonio Rubio
am 27 Mär. 2023
Akzeptierte Antwort
Weitere Antworten (1)
Kshittiz
am 28 Mär. 2023
Hello Antonio,
I understand that you are trying to plot 2 sets of data on the same x-axis, but the x-axis was discontinued. There were 2 ranges, R1 and R2 respectively, and you were trying to plot y1 on the left axis and y2 on the right axis for both the ranges, but you were unable to do.
To achieve this, you have to calculate minimum and maximum limits for both y1 and y2(which are YLMin and YLMax for y1 and YRMin and YRMax for y2 in his code). And then, just use the "yyaxis" function, to create a chart with two y axes and then add all 4 limits which were calculated to them.
Below is the code for the same:
YLmin = min([nexttile(1).YAxis(1).Limits, nexttile(2).YAxis(1).Limits]);
YLmax = max([nexttile(1).YAxis(1).Limits, nexttile(2).YAxis(1).Limits]);
YRmin = min([nexttile(1).YAxis(2).Limits, nexttile(2).YAxis(2).Limits]);
YRmax = max([nexttile(1).YAxis(2).Limits, nexttile(2).YAxis(2).Limits]);
yyaxis(nexttile(1), 'left')
ylim([YLmin YLmax])
yyaxis(nexttile(1), 'right')
ylim([YRmin YRmax])
yyaxis(nexttile(2), 'left')
ylim([YLmin YLmax])
yyaxis(nexttile(2), 'right')
ylim([YRmin YRmax])
I hope it helps!
Thanks!
Kategorien
Mehr zu Data Distribution Plots finden Sie in Hilfe-Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!









