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

KALYAN ACHARJYA
KALYAN ACHARJYA 2021년 5월 30일
Please share the code for quick fix, if possible
Hugo Fortescue
Hugo Fortescue 2021년 5월 30일
I solved it crudely using a tiledlayout with spacing set to none.

댓글을 달려면 로그인하십시오.

 채택된 답변

Adam Danz
Adam Danz 2021년 5월 31일
편집: Adam Danz 2021년 6월 2일

0 개 추천

> "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';

댓글 수: 6

Hugo Fortescue
Hugo Fortescue 2021년 6월 3일
The original question edited as that mistake was a typo, and not part of the issue at hand. Thank you for your intital responce none the less.
I did not know that indervidual lines had handles aswell, thank you very much for your time.
Adam Danz
Adam Danz 2021년 6월 3일
The NodeChildren property is undocumented and that's how I got the individual axis handles. The line objects are children of the axes handles.
Tristan Deppe
Tristan Deppe 2022년 9월 8일
Any ideas why the line colors all revert to black if I resize the figure window or try and save/print the figure?
Great question, @Tristan Deppe. This is the trouble with using undocumented methods.
A workaround is to merely add the line to the axes after creating the stackedplot. Get "ax" from my answer, then,
hold(ax(2),'on');
plot(ax(2),...,'r-')
% 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
hold(ax(2),'on');
plot(ax(2),...,'r-')
% 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';
@Adam Danz I didn't understand your instruction, where should put ?
hold(ax(2),'on');
plot(ax(2),...,'r-')
Adam Danz
Adam Danz 2023년 5월 19일
This answer does not show how to add a line to an axes. It shows how to change the color of an existing line.

댓글을 달려면 로그인하십시오.

추가 답변 (2개)

Hugo Fortescue
Hugo Fortescue 2021년 6월 2일
편집: Hugo Fortescue 2021년 6월 2일

0 개 추천

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

Adam Danz
Adam Danz 2021년 6월 2일
편집: Adam Danz 2021년 6월 2일
> 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.

댓글을 달려면 로그인하십시오.

Lianne Wolsink
Lianne Wolsink 2022년 12월 16일

0 개 추천

Using stackedplot, the color of one line within an axis containing multiple lines can be changed using this code:
a = stackedplot(table,vars);
a.LineProperties(2).Color = [0 0 0
1 0 0]; % changes colors of lines in axis 2 to black for line 1 and red for line 2

카테고리

도움말 센터File Exchange에서 Annotations에 대해 자세히 알아보기

태그

질문:

2021년 5월 30일

댓글:

2023년 5월 19일

Community Treasure Hunt

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

Start Hunting!

Translated by