MATLAB Answers

Stack 2D line plots to create a 3D plot

11 views (last 30 days)
Mai Sakuragi
Mai Sakuragi on 28 Nov 2019
Answered: Raunak Gupta on 5 Dec 2019
I am trying to stack 2D plots and create a 3D plot.
Below is a part of codes to solve the ODEs and compute FFT, and they are the data sets of 2D plots that I am trying to combine.
Fs = 4000;
tspan = 0 : 1/Fs :15;
conds = [0;0;0;0];
omega = 2262.72;
Omega = 148.328;
gamma = 1.519;
tau_opt = 0.1;
topt = 3;
f = @(t,Y) [Y(2) ; -omega^2 * Y(1) + Omega^2 * Y(3) - gamma * Y(2) + sin(omega*t)*exp(-4*log(2)*(t-topt)^2/tau_opt^2) ; Y(4) ; -omega^2 * Y(3) + Omega^2 * Y(1) - gamma * Y(4)];
[ts,ys] = ode45(f, tspan, conds);
x1sol = ys(:, 1);
Fourier1 = fft(x1sol);
x2sol = ys(:, 3);
Fourier2 = fft(x2sol);
Fourier1P = abs(Fourier1).^2 ;
Fourier2P = abs(Fourier2).^2 ;
F1 = 0: Fs/length(Fourier1): Fs - Fs/length(Fourier1);
F2 = 0: Fs/length(Fourier2): Fs - Fs/length(Fourier2);
j = topt+1.0 : 0.05 : topt+2.2
gammafunc = zeros(length(j),length(tspan));
for jj = 1:numel(j)
tTHz = j(jj);
gammafunc(jj,:) = 15*exp(-30*(tspan-tTHz).^2) + gamma;
txt = ['tTHz = ',num2str(tTHz)];
plot(tspan,gammafunc(jj,:),'DisplayName',txt); hold on
xlim([2.5 7.5])
title('γ_1(t)')
end
hold on
legend show
hold off
tsol = zeros(length(tspan), length(j));
G = zeros(length(tspan), 4 ,length(j));
for ii = 1:numel(j)
tTHz = j(ii);
[tsol(:,ii),G(:,:,ii)] = ode45( @(t,G) myode_2(t, G, omega, Omega, gamma, topt, tau_opt, tspan, gammafunc(ii,:)), tspan, conds);
end
fourier1 = zeros(length(tspan), length(j));
fourier2 = zeros(length(tspan), length(j));
fourier1P = zeros(length(tspan), length(j));
fourier2P = zeros(length(tspan), length(j));
f1 = zeros(length(j), length(tspan));
f2 = zeros(length(j), length(tspan));
for ii = 1:numel(j)
fourier1(:,ii) = fft(G(:,1,ii));
fourier2(:,ii) = fft(G(:,3,ii));
fourier1P(:,ii) = abs(fourier1(:,ii)).^2 ;
fourier2P(:,ii) = abs(fourier2(:,ii)).^2 ;
f1(ii,:) = 0: Fs/length(fourier1(:,ii)): Fs - Fs/length(fourier1(:,ii));
f2(ii,:) = 0: Fs/length(fourier2(:,ii)): Fs - Fs/length(fourier2(:,ii));
end
Below I am trying to stack the 2D plots and create a 3D surface plot. Now I am in the process of stacking the 2D plots.
delta_r = zeros(length(tspan), length(j));
for ii = 1:numel(j)
t_THz = j(ii);
delta_r(:,ii) = Fourier1P - fourier1P(:,ii);
end
figure
hold all
delay = zeros(1,length(j));
for ii = 1:numel(j)
t_THz = j(ii);
delay(ii) = t_THz - topt;
plot3(ones(length(delay))*delay(ii),F1, delta_r(:,ii))
end
hold off
xlim([358 363])
ylim([-1e-4 4.5e-4])
view(-50,20)
I have 17 2D plots, but F1 and delta_r(:,ii) are 60001 × 1 arrays. So I get an error saying "error using plot3. Vectors must be the same length"
I only have 17 plots to combine with, so I don't know how to fix the issue.
Any idea?

  0 Comments

Sign in to comment.

Answers (1)

Raunak Gupta
Raunak Gupta on 5 Dec 2019
Hi,
From the bottom-most code I understand you are trying to plot 17 different 2D plots with the x coordinate different for different plot and rest y and z coming from that corresponding plot. You may replace the plot3 command in the code with the following
plot3(ones(length(F1),1)*delay(ii),F1, delta_r(:,ii));
This should clear out the error you are facing.
If it is required to plot a 3D surface instead of stacking up which will have continuity between the 17 plots you may find below code useful.
[X,Y] = meshgrid(delay,F1);
surf(X,Y,delta_r,'EdgeColor','none');
Hope it helps.

  0 Comments

Sign in to comment.

Sign in to answer this question.

Products