该问题涉及2D高斯数据的EM聚类(或K均值)的可视化。比如,我已经在3个不同颜色(例如r,g,b)的散点图中显示了从EM获得的3个聚类,用于3个聚类的数据样本。现在我想在此基础上绘制椭圆轮廓。我不希望三个计数器中的每一个的颜色在整个颜色谱中从r到b变化。对于簇1的轮廓,我想要不同的红色强度,对于簇2,我想要不同的蓝色强度和簇3的相同强度。我将同心轮廓的数量设置为5并尝试通过如下的颜色数组,但是它不起作用。
ColorVec = ['r' ; 'g' ; 'b' ; 'm' ; 'c' ; 'y'; 'b'];
String2RBG = @(C)rem(floor((strfind('kbgcrmyw', C) - 1) * [0.25 0.5 1]), 2);
x = -3:0.1:4;
y = -3:0.1:4;
[X,Y] = meshgrid(x,y);
for k=1:numberOfClusters
Z = mvnpdf([X(:) Y(:)],estimatedMu(k,:),estimatedSigma{k});
Z = reshape(Z,length(y),length(x));
ColorVecConcentricCountours = [String2RBG(ColorVec(k));String2RBG(ColorVec(k))/1.2;String2RBG(ColorVec(k))/1.4;String2RBG(ColorVec(k))/1.6;String2RBG(ColorVec(k))/1.8];
contour(X,Y,Z,5,'color',ColorVecConcentricCountours);hold on;
end
使用ColorVecConcentricCountours会引发错误,但是如果我给出ColorVec(k),它会为所有5个轮廓提供单一的r,g或b阴影,这不是我想要的。
答案 0 :(得分:0)
轮廓图是一组补丁对象。补丁对象有一个' EdgeColor'属性,这就是我们称之为轮廓的线条颜色的东西。您可以使用contourcmap
功能设置图中所有轮廓对象的边缘颜色,但是因为您希望对无法工作的每组线进行单独控制。但是,您可以做的是解决补丁对象本身并分别更改每个补丁对象的边缘颜色。
首先,我编写了名为green
,cyan
的函数,以及其他RGB + CYM颜色,除了内置颜色之外,还允许我将它们用作色彩映射。 green
函数如下所示:
function G = green(m)
%GREEN Green Colormap
% GREEN(M) is an M-by-3 matrix colormap for increasing red intensity.
% GREEN, by itself, is the same length as the current figure's
% colormap. If no figure exists, MATLAB creates one.
%
% See also RED, JET, HSV, HOT, PINK, FLAG, COLORMAP, RGBPLOT.
if nargin < 1
m = size(get(gcf,'colormap'),1);
end
G = zeros(m,3);
G(:,2) = (0:(1/(m-1)):1);
您可以查看内置函数,看看它是如何相似的。要运行下面的代码,您还需要cyan
函数(或将该函数调用更改为您喜欢的任何色彩映射函数)。
通过将几个等高线图放入相同的轴及其手柄(H1
和H2
下方),我们可以用轮廓组来绘制轮廓绘制的水平。 s LevelList
属性,产生每个轮廓级别的向量。每个轮廓补丁对象(组的子对象)具有在补丁对象的UserData
属性中保存的行所绘制的级别。我们可以使用组的LevelList
属性来创建我们想要使用的颜色矩阵,使用色彩映射函数调用,然后使用{{1}中的等高线级别的位置} vector是我们想要用来为该线着色的colormap行。将补丁对象的LevelList
更改为每行的颜色,我们就可以了。这里绘制了两组以显示如何获得具有不同颜色的两个轮廓组。
EdgeColor