Moe
Moe

Reputation: 71

Matlab:Make a contour plot with 3 vectors

I have 3 vectors of data, X (position), Y (position) both of which are not regularly spaced, and Z(value of interest at each location). I tried contourf, which doesn't work because it needs a matrix for Z input.

Upvotes: 7

Views: 32245

Answers (2)

JMinton
JMinton

Reputation: 123

You can also use griddata.

%Generate random data
x = rand(30,1);
y = rand(30,1);
z = rand(30,1);

%Create regular grid across data space
[X,Y] = meshgrid(linspace(min(x),max(x),n), linspace(min(y),max(y),n))

%create contour plot
contour(X,Y,griddata(x,y,z,X,Y))

%mark original data points
hold on;scatter(x,y,'o');hold off

Upvotes: 10

gevang
gevang

Reputation: 5014

For a contour plot you actually need either a matrix of z values, or a set (vector) of z-values evaluated on a grid. You cannot define contours using isolated Z values at (X,Y) points on the grid (i.e. what you claim you have).

You need to have the generating process (or function) provide values for a grid of (x,y) points.

If not, then you can create a surface from nonuniform data as @nate correctly pointed out, and then draw the contours on that surface.

Consider the following (random) example:

N = 64; % point set
x = -2 + 4*rand(N,1); % random x vector in[-2,2]
y = -2 + 4*rand(N,1); % random y vector in[-2,2]

% analytic function, or z-vector
z = x.*exp(-x.^2-y.^2);

% construct the interpolant function
F = TriScatteredInterp(x,y,z);

t = -2:.25:2; % sample uniformly the surface for matrices (qx, qy, qz)
[qx, qy] = meshgrid(t, t); 
qz = F(qx, qy);

contour(qx, qy, qz); hold on; 
plot(x,y,'bo'); hold off

The circles correspond to the original vector points with values (x,y,z) per point, the contours on the contours of the interpolant surface. enter image description here enter image description here

Upvotes: 7

Related Questions