Unexpected flat surface with surf command
Show older comments
I have two parallel lines in a 3D space. I use the following code to create a curved surface which goes though all lines:
% Iterate through the cells in data_cell
for i = 1:2
% Extract the current 500x2 array
current_data = data_cell{i};
% Append the first column values to x
x(:, i) = current_data(:, 1);
% Append the second column values to z
z(:, i) = current_data(:, 2);
% Calculate the index for Dp_values using modular arithmetic
dp_index = mod(i - 1, length(Dp_values)) + 1;
% Create a vector of propeller sizes for this data cell
propeller_size = Dp_values(dp_index) * ones(size(current_data, 1), 1);
y(:, i) = propeller_size;
end
[X, Y] = meshgrid(x, Dp_values);
Z = griddata(x, y, z, X, Y, 'cubic');
surf(X, Y, Z);
However, the final result shows a flat surface on top of the curved surface. The figure looks like this:

I am not sure what goes wrong here, and I have tried to make x, y, z as vectors but it still gave me the same result.
I appreciate any help. Thanks.
For the reference, the data in x is like
[0.0800000000000000 0.0800000000000000
0.0818000000000000 0.0818000000000000
0.0837000000000000 0.0837000000000000
...
0.998200000000000 0.998200000000000
1 1 ]
and y is like
[0.300000000000000 0.470000000000000
0.300000000000000 0.470000000000000
0.300000000000000 0.470000000000000
...
0.300000000000000 0.470000000000000]
and z is like
[0.545136000000000 0.282617000000000
0.541518000000000 0.281099000000000
0.537900000000000 0.279581000000000
...
0.165439000000000 0.0849740000000000]
Answers (1)
Star Strider
on 30 Sep 2023
0 votes
I do not completely understand the problem, however:
[X, Y] = meshgrid(sort(x), sort(Dp_values));
could solve the problem.
The griddata, scatteredInterpolant, and other such functions will likely not care if the data are sorted or not, so long as the argument dimensions make sense to the functions. (If all goes according to plan, sorting the initial vectors should produce the desired surf plot)
4 Comments
Yi-Kai Peng
on 30 Sep 2023
Star Strider
on 30 Sep 2023
I understand that.
I do not have your data, so I can only suggest a solution, based on my experience.
Did you experiment with sorting the vectors as I described in my Answer? If so, what was the result? If that did not solve the problem, I will need your data and code, and preferably a short description of what the data are and the problem you want to solve with them, to experiment with.
Yi-Kai Peng
on 30 Sep 2023
Star Strider
on 30 Sep 2023
Transposing the matrices obviously worked.
Experiment with the scatteredInterpolant function (instead of griddata) to see if it gives a better result. The values may not be defined between the red lines, so a linear interpolation may be the only option, regardless of the chosen interpolation method.
I do not have your data, so this is the best I can do.
Categories
Find more on Interpolation in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!