Saving multiple plots into one handle

I am running a FEM program and need to plot the results for a few different solution iterations and the true solution. My FEM code runs in a loop so every loop I am plotting one solution but I noticed that drawing the figure in a loop is relatively slow compared to saving them all to a handle and plotting at the end. I am new to this method and saw you can use copyobj(), but it's not working correctly and I don't know what I am doing wrong here. Specifically my labels are not working correctly, so I suspect it is drawing too many lines. This is how it is supposed to look:
This is how it looks when I try to optimize the plotting time:
I have attached the file with the working (slow) plotting. What I changed to get the second result is in this (labelled %NEW):
color={'#0048BA','#C46210','#9F2B68','#3B7A57','#665D1E','#89CFF0','#FFB200','#7BB661','#00CED1','#DEB887'};
extraInputsLabel = {'interpreter','latex','fontsize',14};
extraInputsTitle = {'interpreter','latex','fontsize',24};
extraInputsAxis = {'interpreter','latex','fontsize',20};
ind1 = 0;
for m=1:p
ind1 = ind1+1;
ind2 = 1
while tol>tolerance
ind2 = ind2+1;
plt(ind2) = plot(x,uh,'Color',color{ind2},'DisplayName',strcat('$N_e = ',num2str(ne),'$'),LineStyle='--'); %NEW
hold on
end
plt(ind2+1) = plot(x,ut(x),'r','DisplayName','True sol'); %NEW
copyobj(plt,gca) %NEW
axis([0 L -2 2])
title(strcat('$p = ',num2str(m),'$'),extraInputsTitle{:})
xlabel('$x$',extraInputsAxis{:})
ylabel('$u(x)$',extraInputsAxis{:})
legend(extraInputsLabel{:})
figure(ind1+p)
plot(midx,err)
title('Element error',extraInputsTitle{:})
xlabel('$x$',extraInputsAxis{:})
ylabel('$\epsilon_e$',extraInputsAxis{:})
figure(ind1+2*p)
loglog(conv(:,2),conv(:,1))
title(strcat('Convergance plot $(n=',num2str(round(nc,2)),')$'),extraInputsTitle{:})
xlabel('$h_e$',extraInputsAxis{:})
ylabel('$\epsilon_e$',extraInputsAxis{:})
end

2 Kommentare

Alexander
Alexander am 7 Mär. 2024
What is "p"?
Sobhan
Sobhan am 7 Mär. 2024
Bearbeitet: Sobhan am 7 Mär. 2024
It's just the degree of the elements, here p=3 so I am solving for m=1,2,3. But it's not important to the issue, as I experience this for every iteration of m.

Melden Sie sich an, um zu kommentieren.

 Akzeptierte Antwort

0 Stimmen

Why don't you save your results in a variable, as a matrix x2(ind2,:) = x; uh2(ind2,:)=uh; and then once you have all, then you plot.

9 Kommentare

Sobhan
Sobhan am 7 Mär. 2024
How could I then specify the color, linetype and name for each plot? I am specifically thinking about the "strcat('$N_e = ',num2str(ne),'$')". I can't just make ne a vector with all the values, so would I need to type it out ind2 amount of times?
Voss
Voss am 7 Mär. 2024
"I can't just make ne a vector with all the values"
Why not?
Sobhan
Sobhan am 7 Mär. 2024
Bearbeitet: Sobhan am 7 Mär. 2024
I thought it wouldn't be able to concatenate if ne was nx1, but apparently it does and makes a character array with all the values in the right place. Thanks for the clarification!
Sobhan
Sobhan am 7 Mär. 2024
I have a follow up question though, how well does cell storage work in matlab? As uh is a different length each iteration and I don't know the final size of the final uh, is storing them in a cell array efficient or is there a better alternative?
Voss
Voss am 7 Mär. 2024
Using a cell array is a good method for storing multiple different-length vectors.
Sobhan
Sobhan am 7 Mär. 2024
@Voss How would I plot it then without going through a for loop again? Given two cell arrays uh and x, where each cell element needs a label and a color from other arrays.
Voss
Voss am 7 Mär. 2024
Bearbeitet: Voss am 7 Mär. 2024
Here's how you can plot from a cell array without using a loop:
x = {[1 2 3],[1 2 3 4],[1 2 3 4 5]};
uh = {[4 6 5],[8 9 10 7],[10 12 11 13 14]};
ne = [1 10 50];
color = {'#0048BA','#C46210','#9F2B68'};
names = compose('$N_e = %d$',ne);
plot_args = [x; uh];
h = plot(plot_args{:},LineStyle='--');
set(h,{'DisplayName'},names(:),{'Color'},color(:))
legend(h,'Interpreter','latex')
Sobhan
Sobhan am 8 Mär. 2024
Alright, thanks! That worked and doubled the speed.
Voss
Voss am 8 Mär. 2024
You're welcome!

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Kategorien

Mehr zu Programming finden Sie in Hilfe-Center und File Exchange

Produkte

Version

R2023a

Tags

Community Treasure Hunt

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

Start Hunting!

Translated by