How can I fill patch objects using a color map instead of a solid color?

I need to create a plot, as in this image:

model that i want to replicate

I wrote this code:

close all x = [NaN 1 3 7 9 23 8]; y = [NaN 2 6 7 8 2 1]; z = [NaN 1 4 5 5 4 1]; for n = 1:length(z)-1 x1 = x(n); x2 = x(n+1); y1 = y(n); y2 = y(n+1); z1 = z(n); z2 = z(n+1); p = patch([x1 x2 x2 x1], [y1 y2 y2 y1], [0 0 z2 z1], [0 1 1]); set(p, 'LineStyle', 'none'); plot3([x1 x2], [y1 y2], [z1 z2], 'b-', 'linewidth', 3); hold on end view(3); light 

And I get this:

Model generated by this code

This is normal, but each side of the patch has a solid color where I would like to have a color gradient based on the Z value, as in the first image, where the lowest z values ​​are azure and the highest z values ​​are white (with a gradient from the lowest to the highest).

How can I change my script to get this effect?

+6
source share
1 answer

There are several ways to identify your patches and several ways to color them as well . Here you can create your coordinates without a for and plot loop and color your patches with one call to the patch function:

 x = [NaN 1 3 7 9 23 8]; %# Sample x data y = [NaN 2 6 7 8 2 1]; %# Sample y data z = [NaN 1 4 5 5 4 1]; %# Sample z data N = numel(x); %# The number of sample data points X = [x; x([1 1],[N 1:N-1]); x]; %# X coordinates (one patch per column) Y = [y; y([1 1],[N 1:N-1]); y]; %# Y coordinates (one patch per column) Z = [z; z([N 1:N-1]); zeros(2,N)]; %# Z coordinates (one patch per column) C = round(63.*Z./max(Z(:)))+1; %# Color map index map = [linspace(0,1,64).' ... %'# Color map (64 values spanning from ones(64,2)]; %# white to cyan) figure(); %# Open a new figure patch(X,Y,Z,C,'FaceColor','interp',... %# Plot the patches 'EdgeColor','none'); colormap(map); %# Update color map hold on; %# Add to the plot line(X(1:2,:),Y(1:2,:),Z(1:2,:),... %# Plot the line 'Color','b','LineWidth',2); view(3); %# Change the view 

And this will give you the following plot, with patches colored white with the highest values ​​and fading to blue with the lowest values:

enter image description here

Explanation of indexed color display ...

The map variable above is a 64 by 3 matrix between 0 and 1. Each row represents an RGB triplet , thereby defining a unique color from cyan in row 1 to white in row 64. This is used as the color map of the shape. Face color data in C is a set of row indices in this color map, one for each value in Z The lowest values ​​in Z mapped to index 1 (blue in the color map), while the highest values ​​are mapped to index 64 (white in the color map).

+5
source

Source: https://habr.com/ru/post/889811/


All Articles