MATLAB Answers

Customise Colours in stackedplot

6 views (last 30 days)
Hugo Fortescue
Hugo Fortescue on 30 May 2021
Commented: Adam Danz on 3 Jun 2021
I have this figure here, and I need to change the line style of the 2 horizontal images in (b) online. The command :
s.LineProperties(2).Color = 'r'
changes all 3 lines, and I am not sure how to change only a single one.
Thanks!
  2 Comments
Hugo Fortescue
Hugo Fortescue on 30 May 2021
I solved it crudely using a tiledlayout with spacing set to none.

Sign in to comment.

Accepted Answer

Adam Danz
Adam Danz on 31 May 2021
Edited: Adam Danz on 2 Jun 2021
> "I have this figure here, and I need to change the line style of the 2 horizontal images in (b) online. The command s.LineProperties(2).Color='--r' changes all 3 lines, and I am not sure how to change only a single one."
In the original version of your question before it was edited, the color assignment included a linstyle ('--r').
You have to set them separately. These settings will be applied to all lines within the selected axes.
data = sin(linspace(-pi,pi,100)'.*(.5:.5:2.5));
s = stackedplot(data);
s.LineProperties(2).Color = 'r';
s.LineProperties(2).LineStyle = '--';
Working with multiple lines per axes
If there are multiple lines in a pair of stacked axes and you only want to change the color of one line, get the line handles from the axes handles.
% Create table
data = sin(linspace(-pi,pi,100)'.*(.5:.5:3.5));
T = array2table(data,'VariableNames',{'A' 'B' 'C' 'D' 'E' 'F' 'G'});
% Plot 3 lines on the 2nd axes from the top
figure()
Vars = {'A' {'B' 'C' 'D'} 'E' 'F' 'G'};
S = stackedplot(T,Vars,'-k');
S.AxesProperties(2).LegendVisible = 'off';
% Get axes handles
ax = flip(findobj(S.NodeChildren, 'Type','Axes')); % order: top to bottom
% Get line handles in axes #2
lines = flip(ax(2).Children); % order: top to bottom
% Color line #2 in selected axes
drawnow(); pause(.05) % required
lines(2).Color = 'r';
  2 Comments
Adam Danz
Adam Danz on 3 Jun 2021
The NodeChildren property is undocumented and that's how I got the individual axis handles. The line objects are children of the axes handles.

Sign in to comment.

More Answers (1)

Hugo Fortescue
Hugo Fortescue on 2 Jun 2021
Edited: Hugo Fortescue on 2 Jun 2021
I was not able to get the desried results with stackedplot, but have recreated the same format using tiledlayout.
t = tiledlayout(4, 1)
t.TileSpacing = 'none';
t.Padding = 'loose';
a = nexttile;
plot(A, 'k');
set(a, 'XTickLabel',[], 'xtick', [], 'FontSize', 14);
ylabel('(i)','rotation',0,'VerticalAlignment','middle', 'HorizontalAlignment', 'right');
b = nexttile;
plot(B1, 'k');
hold on
plot(B2, '--r');
plot(B3, '--r');
set(b, 'XTickLabel',[], 'xtick', [], 'FontSize', 14);
ylabel('(ii)','rotation',0,'VerticalAlignment','middle', 'HorizontalAlignment', 'right');
c = nexttile;
plot(C, 'k');
set(c, 'XTickLabel',[], 'xtick', [], 'FontSize', 14);
ylabel('(iii)','rotation',0,'VerticalAlignment','middle', 'HorizontalAlignment', 'right');
d = nexttile;
plot(D, 'k');
set(d, 'FontSize', 14);
ylabel('(iv)','rotation',0,'VerticalAlignment','middle', 'HorizontalAlignment', 'right');
xlabel('X Axis Lable');
han2 = axes(fig2,'visible','off');
han2.YLabel.Visible = 'on';
ylab = ylabel(han2,'Y Axis Lable');
set(han2, 'FontSize', 14)
ylab.Position(1) = -0.1;
ylab.Position(2) = 0.5;
It is by no means a perfect solution, but replicates the desired reuslts well.
  1 Comment
Adam Danz
Adam Danz on 2 Jun 2021
> I was not able to get the desried results with stackedplot
I just noticed that your 2nd axes has 3 lines - they are difficult to see in the embedded image in your question. I've updated my answer to show how to set the color of a single line in stackedaxes that contains multiple lines per axes.

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!