1

我正在尝试使用下面显示的代码以这样的方式进行绘图,即每个等值面的颜色都会不同,并且右侧会有一个颜色条。我ss(k)为不同的颜色制作了一个颜色矩阵。等值面的数量是 10,但我只有 8 种颜色。这就是我写ss(9)='r'ss(10)='r'.

我需要一个解决方案来绘制具有不同颜色和右侧条形的等值面。

ss=['y','m','c','r','g','b','w','k','r','r']
k=1;
for i=.1:.1:1
 p=patch(isosurface(x,y,z,v,i));
 isonormals(x,y,z,v,p)
 hold on;

 set(p,'FaceColor',ss(k),'EdgeColor','none');
 daspect([1,1,1])
 view(3); axis tight
 camlight 
 lighting gouraud
 k=k+1;
end

在此处输入图像描述

4

3 回答 3

3

另一种可能性是使用直接颜色映射(通过设置属性'CDataMapping'='direct')绘制补丁,同时将'CData'每个补丁的 分配给您选择的颜色图中的索引。实际上,建议这样做是为了获得最大的图形性能。

考虑以下示例:

%# volumetric data, and iso-levels we want to visualize
[x,y,z,v] = flow(25);
isovalues = linspace(-2.5,1.5,6);
num = numel(isovalues);

%# plot isosurfaces at each level, using direct color mapping
figure('Renderer','opengl')
p = zeros(num,1);
for i=1:num
    p(i) = patch( isosurface(x,y,z,v,isovalues(i)) );
    isonormals(x,y,z,v,p(i))
    set(p(i), 'CData',i);
end
set(p, 'CDataMapping','direct', 'FaceColor','flat', 'EdgeColor','none')

%# define the colormap
clr = hsv(num);
colormap(clr)

%# legend of the isolevels
%#legend(p, num2str(isovalues(:)), ...
%#  'Location','North', 'Orientation','horizontal')

%# fix the colorbar to show iso-levels and their corresponding color
caxis([0 num])
colorbar('YTick',(1:num)-0.5, 'YTickLabel',num2str(isovalues(:)))

%# tweak the plot and view
box on; grid on; axis tight; daspect([1 1 1])
view(3); camproj perspective
camlight; lighting gouraud; alpha(0.75);
rotate3d on

截屏

我还包含(注释)代码来显示图例,但我发现它是多余的,并且颜色条看起来更好。

于 2011-10-14T20:02:28.123 回答
1

Matlab 通常会自动绘制不同颜色的不同等值面,因此您无需关心。你需要什么样的酒吧?彩条还是图例?无论哪种方式,它只是使用颜色栏或图例功能..

%Create some nice data
[x y z] = meshgrid(1:5,1:5,1:5); 
v = ones(5,5,5);
for i=1:5
   v(:,:,i)=i;
end
v(1:5,3:5,2)=1
v(1:5,4:5,3)=2

%Plot data
for i=1:5
isosurface(x,y,z,v,i)
end

%Add legend and/or colorbar
legend('one','Two','Three','Four')
colorbar

图片

于 2011-10-10T09:18:04.713 回答
0

由于颜色条编码值->颜色,因此不可能按照您的要求进行操作,除非所有表面对之间的 z 值没有交集。所以下面的解决方案假设是这种情况。如果不是这种情况,您仍然可以通过向每个曲面添加一个常数值来实现它,以便沿 z 轴分离曲面,并消除任何相交。

该解决方案基于构建分段常数值的颜色图矩阵,其分布类似于曲面的 z 值。例如,如果你有 3 个表面,第一个表面的 z 值介于 1 和 10 之间,第二个表面的 z 值介于 11 和 30 之间,第三个表面的 z 值介于 31 和 60 之间,你应该这样做(为了简单起见,我在 2D 中绘制)

r = [1 0 0];
g = [0 1 0];
b = [0 0 1];
cmap = [r(ones(10,1),:); g(ones(20,1),:); b(ones(30,1),:)];

z1 = 1:10;
z2 = 11:30;
z3 = 31:60;

figure; hold on
plot(z1,'color',r)
plot(z2,'color',g)
plot(z3,'color',b)
colorbar
colormap(cmap)

自定义颜色条

可以使用红色、绿色和蓝色的不同混合构建更复杂的颜色图(即更多颜色)(http://www.mathworks.com/help/techdoc/ref/colorspec.html

于 2011-10-10T09:28:04.910 回答