2011-10-10 373 views
1

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

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

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 

enter image description here

+0

还没有答案................奇怪 – gman

+3

它不是很清楚你的问题是什么......你的代码不能这样运行,因为你不定义x,...不是很激励回答:-( –

回答

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 

Image

+0

感谢man..thats我想知道... :) – gman

0

由于彩条编码值 - >颜色,它是不可能做到你要求什么,除非所有表面对之间的z值没有交点。所以下面的解决方案假定情况是这样的。如果不是这种情况,您仍然可以通过向每个表面添加一个常数值来实现此目的,以便沿z轴分开这些表面,并消除任何相交。

该解决方案基于构造分段常量值的颜色映射矩阵,分布类似于曲面的z值。例如,如果您有3个曲面,第一个曲面的z值介于1到10之间,第二个曲面介于11和30之间,第三个曲面介于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) 

custom colorbar

更复杂的色彩映射表(即,更多的颜色)可以用红,绿和蓝的不同混合物来构造(http://www.mathworks.com/help/techdoc/ref/colorspec.html

1

另一种可能性是绘制直接颜色补丁(通过设置属性'CDataMapping'='direct'),同时指定将每个修补程序的添加到所选颜色表中的索引。这实际上是recommended的最大图形性能。

考虑下面的例子:

%# 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 

screenshot

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

+0

非常感谢... – gman

相关问题