4 views (last 30 days)

Hi.

I have a set of data points, C at each x and y (for many cases). In 2D, the plot looks simply like this:

So this is a sample plot for one x. There are similar plots for other x values as well.

What I want is some kind of surface plot. How can I get it? I tried to use surf and contour, but they need their z to be a matrix, not an array.

For instance, the data looks like this:

% set1

x = [1 1 1 1];

y = [1 3 5 16];

C = [100 400 200 500];

% set2

x = [2 2 2 2];

y = [4 7 8 13];

C = [200 500 700 100];

Thank you

Star Strider
on 10 Dec 2019

Try this (with your own vectors):

x = rand(10,1); % Create Data

y = rand(10,1); % Create Data

z = rand(10,1); % Create Data

[X,Y] = ndgrid(sort(x), sort(y)); % Create Interpolation Grids

Z = griddata(x, y, z, X, Y); % Interpolate ‘z’

figure

surf(X, Y, Z)

hold on

stem3(x, y, z, 'filled')

hold off

grid on

Experiment to get different results.

Star Strider
on 10 Dec 2019

I was not expecting that possibility.

Try this:

% set1

x1 = [1 1 1 1];

y1 = [1 3 5 16];

C1 = [100 400 200 500];

% set2

x2 = [2 2 2 2];

y2 = [4 7 8 13];

C2 = [200 500 700 100];

xm = [x1; x2];

ym = [y1; y2];

Cm = [C2; C2];

figure

surf(xm, ym, Cm)

grid on

Extend it for more vectors. Note that they all must have the same column sizes for this to work (that is, they all need to be row vectors with the same number of columns).

Star Strider
on 10 Dec 2019

As always, my pleasure!

You can make them all the same size with the interp1 or interp2 functions. It is slightly more work, however you can then use all your data.

For example, to extend ‘x1’, ‘y1’, and ‘C1’ to each have a length of 7:

x1i = x1(1)*ones(1,7);

y1i = interp1((1:numel(x1)), y1, linspace(1, numel(x1), numel(x1i)));

C1i = interp1((1:numel(x1)), C1, linspace(1, numel(x1), numel(x1i)));

You could probably create a function to do this.

Sign in to comment.

Sign in to answer this question.

Opportunities for recent engineering grads.

Apply Today
## 0 Comments

Sign in to comment.