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

2 views (last 30 days)
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!

Accepted Answer

Star Strider
Star Strider on 19 Sep 2023
Edited: Star Strider on 19 Sep 2023
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 Comments
David Franco
David Franco on 20 Sep 2023
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 on 20 Sep 2023
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.
.

Sign in to comment.

More Answers (0)

Categories

Find more on Line Plots in Help Center and File Exchange

Products


Release

R2023a

Community Treasure Hunt

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

Start Hunting!