Plot a 3D array using patch
===========================
Adam H. Aitkenhead
adam.aitkenhead@christie.nhs.uk
The Christie NHS Foundation Trust
17th August 2010
USAGE
=====
This function enables a 3D array to be displayed using a patch surface mesh. To plot a 3D logical array, the function is called using the following syntax:
>> hpat = PATCH_3Darray(gridINPUT,gridX,gridY,gridZ);
Alternatively, a 3D numeric array can be plotted such that the colour of each facet corresponds to the value of each voxel in the array. The plot is generated using the following command. (Note that voxels which are not to be displayed should contain a value of NaN.)
>> hpat = PATCH_3Darray(gridINPUT,gridX,gridY,gridZ,'col');
The colormap to be used for the display of a 3D numeric array can be defined as follows:
>> cmap = jet(16);
>> hpat = PATCH_3Darray(gridINPUT,gridX,gridY,gridZ,cmap,'col');
Also, the colorbar lower and upper limits can be defined by the user as follows:
>> clim = [1,10];
>> hpat = PATCH_3Darray(gridINPUT,gridX,gridY,gridZ,clim,'col');
INPUT PARAMETERS
================
gridINPUT - 3D array of size (P,Q,R) - If not using the flag 'col', then gridINPUT should be a logical array. If using the flag 'col', then gridINPUT should be a numeric array, and all voxels which are not to be displayed should contain a value of NaN.
gridX (optional) - A 1xP array - List of the X axis coordinates.
gridY (optional) - A 1xQ array - List of the Y axis coordinates.
gridZ (optional) - A 1xR array - List of the Z axis coordinates.
cmap (optional) - A Nx3 array - The colormap definition. When plotting using the 'col' flag, cmap must be an Nx3 array, eg jet(32). When plotting a logical array, cmap must be an RGB triplet, eg [0.5,0.5,0].
clim (optional) - A 2x1 array - The colormap upper and lower limits.
ADDITIONAL INPUT FLAGS
======================
'col' (optional) - When this flag is present, the surface is plotted using colours which correspond to the value in each voxel. In the input array gridINPUT, voxels which are not to be displayed should have a value of NaN.
'barN' (optional) - Display a colorbar on North of plot.
'barE' (optional) - Display a colorbar on East of plot.
'barS' (optional) - Display a colorbar on South of plot.
'barW' (optional) - Display a colorbar on West of plot.
OUTPUT PARAMETERS
================
hpat (optional) - Handle to the patch object.
hcbar (optional) - Handle to the colorbar.
EXAMPLE
=======
For two examples, run the following code:
>> load exampleA.mat
>> figure
>> hpat = PATCH_3Darray(gridINPUT,gridX,gridY,gridZ);
>> load exampleB.mat
>> figure
>> cmap = jet(16);
>> hpat = PATCH_3Darray(gridINPUT,gridX,gridY,gridZ,'col',cmap);
Adam A (2021). Plot a 3D array using patch (https://www.mathworks.com/matlabcentral/fileexchange/28497-plot-a-3d-array-using-patch), MATLAB Central File Exchange. Retrieved .
Inspired: Spectral Imaging Toolbox, 2d and 3d brain plots
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!Create scripts with code, output, and formatted text in a single executable document.
nice work. Is it possible to enable lighting effects?
The examples do not work
Hi,
Great work, Adam, thank you very much. How could I obtain a smoothed representation, so the voxels do not seem cubes? I tried with shading(gca, 'flat') in Matlab R2014a, but no success.
All the best,
Ursula
Hi Adam,
Great work!
I have to comment out line 511 in your file for the specified coordinates (gridX, gridY, gridZ) to work for my data:
%axis equal tight;
I get a 2D figure otherwise. I can send you my data if you want.
Thanks,
Peter-Paul
Great work Adam.
However, I get this error whenever I run your code on my data:
??? Undefined function or method 'PATCH_3Darray' for input arguments of type 'double'.
Any idea of why I am getting this error and what should I do to fix it?
I found solution to my problem. It is just great, thank you once more.
Hello Adam, thank you so much for your work. I was just wondering how can i get a GRIDinput of reasonable size filled with Nans from my gridX,Y,Z vectors? i am trying meshgrid but the results is way to big and i am exceeding memory capacity. Do you please have any hint regarding my problem?
Thanks you,
Arthur
thanks adaM GREAT WORK
thank you for the great job.i wish u can give me a hand with this,what change i should apply to ur function so i can define a colorbar range. so the voxels colores will be mapped according to its value. and if its value is bigger than the highst rang it will be mapped to the highst rang and if it is smaller than the lower range it will be mapped to the lowest value.
You may extend it by adding Alpha feature
1.
- after line 431 add: set(cell2mat(hpat),'FaceAlpha',alpha);
- or do it per cell basis one line earlier
2. after line 477 add: set(hpat,'FaceAlpha',alpha);
Alfa information could be specified as scalar, map or per element
Grate Adam, thanks, It’s efficient and just what I was seeking.
Hi Rory,
Glad you're finding it useful. Regarding your problem, are you remembering to use the flag 'col' when you call the function? For example:
hpat = PATCH_3Darray(gridINPUT,gridX,gridY,gridZ,'col');
this is just what i was looking for, and super easy to use too!
my m x n x p array is mostly filled with NaN, and some values are in the range of ~100-10000. When I plot it with your function, everything is blue, as if the non-NaN values were all zero. Any clue how I can fix this?
thanks!!
I havent had a chance to test this code, but it seems that you are trying to solve what I tried in the submission below. Judging from your image attachements, it seems that your solution is more complete than mine.
http://www.mathworks.com/matlabcentral/fileexchange/30721-image3