Search code examples
matlabplotmatlab-figurescatter-plot

Plotting a coloured 3D figure in MATLAB


I have 3 axes: X of size N, Y of size M and Z of size O, which correspond to the coordinates of my data.

I have a matrix: DATA of size MxNxO, which corresponds to the module for each points.

I would like to plot the MATLAB figure of coordinate X, Y, Z and color the point depending of the value of the matrix DATA of size MxNxO.

I tried lots of functions such as scatter3, surf, plot3, but none is working as I wanted.

This is what I tried:

n = 10;
x = linspace(0,10,n);
y = linspace(0,10,n);
z = linspace(0,10,n);

DATA = randn(n,n,n);

scatter3(x,y,z,DATA);

This code didn't work because DATA is not the same size as x, y, z. I also tried with:

[X,Y,Z] = ndgrid(x,y,z) 
scatter3(X,Y,Z,DATA);

but this didn't work either.


Solution

  • The trick with scatter3() is to "unroll" your matrices to a column vector, and don't forget that the fourth argument is size, rather than colour:

    n = 10;
    x = linspace(0,10,n);
    y = linspace(0,10,n);
    z = linspace(0,10,n);
    [X,Y,Z] = ndgrid(x,y,z);
    DATA = randn(n,n,n);
    
    % here 3 is the size. You can set it to a different constant, or vary it as well
    scatter3(X(:), Y(:), Z(:), 3, DATA(:));
    

    Results in

    enter image description here

    You can colour a surface, see its documentation, however, it doesn't seem to make much sense in your case, given you have a full cube of data points. A surface is 2D, whereas your data is 3D. For a 2D surface, simply follow the example in the docs:

    n = 10;
    x = linspace(0,10,n);
    y = linspace(0,10,n);
    
    Z = rand(n);
    DATA = randn(n);
    
    surf(x, y, Z, DATA);
    

    enter image description here

    Images rendered in R2007b, syntax cross-checked with the documentation.

    If you've got a surface defined by an M -by- 4 array containing X, Y, Z and Data, you can use delaunay() to create a Delaunay triangulation of your points and then trisurf() to plot that. Note that this still requires a 2D surface, albeit it can vary in three dimensions. The cube of data in your example still doesn't make sense to plot as a surface, even with this method.