Problem with reshape and Surf plot

2 次查看(过去 30 天)
Hello MATLAB Community,
I have the following script and data where i would like to plot a 3d Surface and it works well for some data and it doesn't work because of the dimensions in some cases. Can someone please suggest where is the mistake in the script and how to fix it?
opts = detectImportOptions('Data123.xlsx');
opts = opts.setvartype('Y','double');
opts = opts.setvartype('Z','double');
% Load data
data = readtable('Data123.xlsx', opts);
data.Properties.VariableNames = ["X","F_sw","Y","Z"];
% order the data
data = sortrows(data,["X","Y"]);
X = unique(data.X);
Y = unique(data.Y);
Z = reshape(data.Z,[length(Y),length(X)]);
% View
figure(1)
scatter3(data.X,data.Y,data.Z,12,[1 0 0],"filled","MarkerEdgeColor",[0 0 0])
hold on
s = surf(X,Y,Z,"FaceColor",'interp');
hold off
  6 个评论
ragnor
ragnor 2021-7-26
If i don't use unique, is there any other way, i can create a surface plot with the data.
I just want to make a 3d surface plot to display the results.
Thanks in advance.
ragnor
ragnor 2021-7-26
I just want to make a 3D surface plot as displayed in the attached figure.

请先登录,再进行评论。

采纳的回答

Star Strider
Star Strider 2021-7-27
The only solution I can propose is to use either griddata or scatteredInterpolant .
Try this —
opts = detectImportOptions('https://www.mathworks.com/matlabcentral/answers/uploaded_files/695269/Data123.xlsx');
opts = opts.setvartype('Y','double');
opts = opts.setvartype('Z','double');
% Load data
data = readtable('https://www.mathworks.com/matlabcentral/answers/uploaded_files/695269/Data123.xlsx', opts)
data = 184×4 table
X F_sw Y Z _____ ____ ___ ______ 10000 350 0.5 2.9008 10000 350 1 3.0802 10000 350 1.5 3.2261 10000 350 2 3.3174 10000 350 2.5 3.3299 10000 350 3 3.3618 10000 350 3.5 3.4404 10000 350 4 3.5091 10000 350 4.5 3.5816 10000 350 5 3.6302 10000 350 5.5 3.6945 10000 350 6 3.7262 10000 350 6.5 3.7544 10000 350 7 3.7761 10000 350 7.5 3.7944 10000 350 8 3.8067
data.Properties.VariableNames = ["X","F_sw","Y","Z"];
% order the data
data = sortrows(data,["X","Y"]);
% X = unique(data.X);
% Y = unique(data.Y);
X = data.X;
Y = data.Y;
Z = data.Z;
N = 50;
xv = linspace(min(X), max(X), N);
yv = linspace(min(Y), max(Y), N);
[Xm,Ym] = ndgrid(xv, yv);
Zm = griddata(X,Y,Z,Xm,Ym);
% Z = reshape(data.Z,[length(Y),length(X)]);
% View
figure(1)
scatter3(data.X,data.Y,data.Z,12,[1 0 0],"filled","MarkerEdgeColor",[0 0 0])
hold on
s = surf(Xm,Ym,Zm,"FaceColor",'interp', 'EdgeColor','none');
hold off
If it is not the result you want, I will delete my Answer.
.
  4 个评论
ragnor
ragnor 2021-7-28
@Star Strider: Thank you very much. It was indeed very uselful and it is something i wanted to plot.
Thanks again.

请先登录,再进行评论。

更多回答(0 个)

类别

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

产品


版本

R2020a

Community Treasure Hunt

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

Start Hunting!

Translated by