8

I know I can create a 3D surface plot in MATLAB by doing:

x = linspace(1,10,100);
y = linspace(10,20,100);

[X Y] = meshgrid(x,y);

Z = X * Y;

surf(X,Y,Z);

But this requires that all the nodes for the height map generated line up. I have a set of data which has arbitrary points (x,y) and a height (z). Is there a simple way to plot a graph which will generate a surface between the points in a similar fashion to surf?

MatlabDoug
  • 5,704
  • 1
  • 24
  • 36
JP.
  • 5,507
  • 15
  • 59
  • 100

2 Answers2

10

Appologies, after some hunting I managed to answer my own question:

You can use the trisurf function:

tri = delaunay(x,y);
trisurf(tri,x,y,z);

If you have dense data you will want to do shading interp (or another value, check doc shading) so you don't get a black blob due to the grid.

JP.
  • 5,507
  • 15
  • 59
  • 100
  • 2
    Actually, the best way to avoid the black blob is to set the property `edgeColor` to `none`. – Jonas May 17 '10 at 11:03
3

It looks like you've found your answer by using DELAUNAY and TRISURF to generate and plot a triangulated surface.

As an alternative, you could also fit a regularly-spaced grid to your nonuniformly-spaced points in order to generate a surface that can be plotted with the SURF command. I discuss how this can be done using the TriScatteredInterp class (or the deprecated function GRIDDATA) in my answer to this other question on SO.

Community
  • 1
  • 1
gnovice
  • 125,304
  • 15
  • 256
  • 359