Stack 2D line plots to create a 3D plot

19 views (last 30 days)
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?

Accepted Answer

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.
  1 Comment
Saurabh Shukla
Saurabh Shukla on 9 Jun 2021
Edited: Saurabh Shukla on 9 Jun 2021
Hello Raunak, I have a very similar problem (the first case in your answer). I want to do something further.
After my linear plots( in y-z plane) are spread across x axis, I wish to drop a transparent plane in x-z direction, at a fixed y value, and show where this transparent plane has intersections with the line plot.
Is this possible anyhow?

Sign in to comment.

More Answers (0)

Products

Community Treasure Hunt

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

Start Hunting!