How to plot multiple time series cell arrays as a shadowed area

1 次查看(过去 30 天)
Hi guys!
I have the following cell data (each column represents a different algorithm for comparison; each row represents a experiment run):
* The data is attached.
Using this code:
figure
hold on
cellfun(@plot,mutation1)
I get this plot:
Question 1: How can I represent each column of data in a specific color in the plot using the code above?
Three columns have constant data (single lines: purple, blue and green). Two columns have data with small variations (the other two multicolored lines on the graph).
Question 2: Would it be possible to represent these two multicolored lines (which are made up of a series of other lines) as a shaded area with a middle line?
Thank you very much!

采纳的回答

Star Strider
Star Strider 2023-9-19
编辑:Star Strider 2023-9-19
Answer 1: See the colororder call.
Answer 2: Yes, although it takes a bit of exploring to determine what those curves are. I left in my ‘exploration’ steps (commented-out). After that, this is straightforward.
Try this —
LD = load('mutation1.mat');
mutation1 = LD.mutation1
mutation1 = 20×5 cell array
{300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double} {300×1 double}
colororder(turbo(numel(mutation1))) % Use The 'turbo' 'colormap' To Define The Colours
mutationmtx = cell2mat(reshape(mutation1, 1,[]));
% figure
% surf(mutationmtx, 'EdgeColor','none')
% colormap(turbo)
% xlabel('Columns')
% ylabel('Rows')
%
% figure
% plot((1:size(mutationmtx,2)), mutationmtx(1,:))
% hold on
% plot((1:size(mutationmtx,2)), mutationmtx(150,:))
% hold off
% grid
% legend('1','150', 'Location','best')
Lv1 = mutationmtx(1,:) > 0.3;
Lv2 = mutationmtx(150,:) > 0.05;
highest = max(mutationmtx(:,Lv1 & ~Lv2),[],2);
lowest = min(mutationmtx(:,Lv1 & Lv2), [],2);
middleline = median([highest lowest],2);
% figure
% plot(highest, 'g')
% hold on
% plot(lowest, 'r')
% hold off
v = (1:numel(highest)).';
figure
hold on
cellfun(@plot,mutation1)
patch([v; flip(v)], [highest; flip(lowest)], [1 1 1]*0.75, 'FaceAlpha',0.5)
plot(middleline, '-g', 'LineWidth',1.5)
% Ax = gca;
% Ax.XScale = 'log';
See the documentation on patch for those details.
EDIT — (19 Sep 2023 at 13:52)
Forgot about ‘middle line’, Now added.
.
  4 个评论
David Franco
David Franco 2023-9-20
Thank you again @Star Strider! I found a workaround:
Since the first three columns of the cell have the same values (they are deterministic), it is not necessary to plot all of them, so I took the average (I could also take just one sample from each of the three columns)...
For columns 4 and 5 (they are stochastic) I took the maximum and minimum values (because these are variables).
So I didn't need to use the cellfun function and I was able to define the colors and create the correct caption.
load mutation1.mat
n = size(mutation1,1);
mutationmtx = cell2mat(reshape(mutation1,1,[]));
ga1 = mean(mutationmtx(:,1:n),2);
ga2 = mean(mutationmtx(:,n+1:2*n),2);
ga3 = mean(mutationmtx(:,2*n+1:3*n),2);
min_ga4 = min(mutationmtx(:,3*n+1:4*n),[],2);
max_ga4 = max(mutationmtx(:,3*n+1:4*n),[],2);
min_ga5 = min(mutationmtx(:,4*n+1:5*n),[],2);
max_ga5 = max(mutationmtx(:,4*n+1:5*n),[],2);
v = (1:numel(min_ga4)).';
figure
hold on
plot(v,ga1,'Color',[0.0000,0.4470,0.7410]')
plot(v,ga2,'Color',[0.9290,0.6940,0.1250]')
plot(v,ga3,'Color',[0.4940,0.1840,0.5560]')
patch([v; flip(v)], [max_ga4; flip(min_ga4)], 'g', 'FaceAlpha',0.5)
patch([v; flip(v)], [max_ga5; flip(min_ga5)], 'r', 'FaceAlpha',0.5)
legend('GA1','GA2','GA3','GA4','GA5')
The result:
I'm sorry if I hadn't explained it clearly from the beginning. As English is not my native language, it is sometimes difficult to correctly express my ideas. =)
Star Strider
Star Strider 2023-9-20
As always, my pleasure!
No worries — some concepts are difficult to put into words regardless of the language, especially some mathematical concepts. I am happy that I could help you get this sorted.
.

请先登录,再进行评论。

更多回答(0 个)

类别

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

产品


版本

R2023a

Community Treasure Hunt

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

Start Hunting!

Translated by