用于等值面的不同颜色的Matlab绘图

时间:2011-10-10 03:34:07

标签: matlab plot 3d data-visualization geometry-surface

我尝试使用下面显示的代码以这样的方式绘制每个iso-surface的颜色不同,右边会有一个颜色条。我为不同的颜色制作了ss(k)颜色矩阵。等表面的数量是10,但我只有8种颜色。这就是我写ss(9)='r'ss(10)='r'的原因。

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

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

3 个答案:

答案 0 :(得分:2)

另一种可能性是使用直接颜色映射(通过设置属性'CDataMapping'='direct')绘制补丁,同时将每个补丁的'CData'分配给您选择的颜色映射中的索引。实际上这是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

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

答案 1 :(得分: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

答案 2 :(得分:0)

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

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

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)的不同混合构造更复杂的色彩图(即更多颜色)