我需要创建一个如下图所示的情节:
我写了这段代码:
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
我明白了:
这没关系,但是每个补丁面都有一个纯色,我希望有一个基于Z值的颜色渐变,就像在第一个图像中,最低z值是天蓝色,最高z值是白色(带有从最低到最高的渐变。
如何修改我的脚本才能获得此效果?
答案 0 :(得分:5)
define your patches有多种方式,color them as well有多种方式。这是一种在没有for循环的情况下创建坐标数据的方法,只需调用函数patch
即可为补丁绘图和着色:
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
这将为您提供以下图表,其中补丁在最高值处为白色,在最低值处为青色渐变:
上面的变量map
是一个介于0和1之间的64×3矩阵。每一行代表一个RGB triplet,因此定义了从第1行的青色到白色的唯一颜色。第64行。这用作图形颜色图。 C
中的面部颜色数据是此颜色映射中的一组行索引,Z
中的每个值都有一个。 Z
中的最低值映射到索引1(颜色映射中为青色),而最大值映射到索引64(颜色映射中为白色)。