2012-09-13 70 views
0

我想绘制一个二维网格的三角形。我想根据给定的正数标量的数组A为每个三角形着色,每个三角形使用一个;例如,假设A包含每个三角形的面积,并且我希望大三角形比较小的三角形更粉红。我知道如何做到这一点:颜色三角形有一些例外

patch('Faces',tri,'Vertices',V,'FaceColor','flat', 
      'FaceVertexCData',A,... 
      'CDataMapping','scaled'); 
colormap(pink); 

不过,我也有另外一个布尔数组B,每个三角形一个布尔值。例如,它标记哪个三角形是等腰三角形。 如果一个三角形在B中标记为1,我想为它着黄色。

我认为这可以通过类似A(B==1)=-1,更改colormap和巧妙设置caxis来实现,但这是最优雅的方式吗?

回答

0

是否要跳过某些三角形的着色(用一种颜色对它们着色),还是对这些三角形使用不同的颜色表?

对于二维图,第一种情况相对简单。您可以将这些三角形中的A设置为NaN,并且修补程序不会绘制它们。此外,改变剧情的背景颜色将有效地显示在彩色非绘制三角形你想

A(B)=NaN; 
set(gca,'Color',[1 0 0]); % red 

如果要使用不同的颜色或颜色范围,你必须要追加的colormaps并设置在A中的值用于各个三角形是“足够大”比一种用于任何其他的三角形:

cmap = [colormap; [1 0 0]]; % red 
colormap(cmap); 
A(B) = max(A)+1; 

无需与轴线玩。否则,如果你想要包含两种不同的色阶,你必须使用你的色块图的CData属性,参见一个很好的教程here来绘制两张图,一张是灰度图,另一张是同一张图的颜色。

还有this后有关如何绘制两个不同的颜色映射两个不同的数据集。这是通过追加两个颜色映射来完成的,并确保两个数据集访问最终颜色映射的不同部分。

+0

如果'A = [1 2 3 10000]'那么我不认为这个技巧会起作用。你建议'A(B)= 10001',但是'10001'和'10000'会映射到相同的颜色 – olamundo

+0

@noam当然,这个例子是在[0,1]范围内的A。如果确保A(B)设置为“足够大”的值,该怎么办? – angainor

+0

当然可以这样做,但这些正是我希望避免的那种技巧。 为了完整起见,“足够大”本身并不够好,如果你采取'A = [1 2 3]'和'足够大'的加法,A(B)= 100000 ',那么现在'1','2','3'映射到相同的颜色。找到正确的值并不难,但我希望尽可能避免。 – olamundo