具有一个级别的多个matlab等高线图

时间:2016-03-25 12:44:55

标签: matlab plot contour fill

我有两个类别的2d概率质量函数。我试图绘制轮廓以使它们可视化(例如在它们的半高处,但并不重要)。

我不想直接使用contourf绘图,因为我想控制填充颜色和不透明度。所以我使用contourc生成xy坐标,然后使用fill和这些xy坐标。

问题是来自contourc函数的xy坐标中有奇怪的数字,这会导致绘制下面的奇怪顶点。

enter image description here

起初我认为这是奇怪的contourmatrix格式,但我不认为这是因为我只要求contourc中的一个值。例如......

contourmatrix = contourc(x, y, Z, [val, val]);
h = fill(contourmatrix(1,:), contourmatrix(2,:), 'r');

当我只要求一个轮廓时,是否有人知道为什么contourmatrix中有这些奇数值?

更新

当输入的2D矩阵不是“平滑”时,我的问题似乎可能是contourc的失败模式。我的源数据是一大组(x,y)点。然后我创建了一个带有一些hist2d函数的2D矩阵。但是当这很吵时,这个问题就被夸大了...... enter image description here

但是当我使用2d内核密度函数来产生更平滑的2D功能时,问题就会减少...... enter image description here

完整的过程是 a)我有一组(x,y)点,它们来自分布 b)我将其转换为2D pmf c)使用contourc创建一个等值线矩阵 d)使用fill

绘图

1 个答案:

答案 0 :(得分:1)

您的图形故障是由于您使用ContourMatrix中的数据的方式。即使您只指定了一个isolevel,也会导致几个不同的填充区域。因此ContourMatrix可能包含多种形状的数据。

简单的例子:

isolevel = 2 ;
[X,Y,Z] = peaks ;
[C,h] = contourf(X,Y,Z,[isolevel,isolevel]);

产地:

contourf output

请注意,即使您只指定了一个要绘制的等级,也会产生2个补丁(2个形状)。每个都有自己的定义,但它们都嵌入在ContourMatrix中,因此如果要单独提取每个形状坐标,则必须解析它。

为了证明这一点,如果我简单地将完整的轮廓矩阵抛给patch函数( fill 函数,无论如何都会创建补丁对象,所以我更喜欢在实际使用时使用低级功能)。我得到了与你相同的故障线:

xc = X(1,:) ;
yc = Y(:,1) ;
c = contourc(xc,yc,Z,[isolevel,isolevel]);
hold on
hp = patch(c(1,1:end),c(2,1:end),'r','LineWidth',2) ;

会产生同样的故障:

not parsed

现在,如果在不包含定义列的情况下正确提取每个形状坐标,则可以获得正确的形状。下面的示例是提取和绘制每个形状以获取灵感的一种方法,但它们有很多种方式可以区别对待。你当然可以压缩代码很多,但在这里我详细说明了操作。

关键是要阅读并理解ContourMatrix是如何构建的。

parsed = false ;
iShape = 1 ;
while ~parsed
    %// get coordinates for each isolevel profile
    level   = c(1,1) ; %// current isolevel
    nPoints = c(2,1) ; %// number of coordinate points for this shape

    idx = 2:nPoints+1 ; %// prepare the column indices of this shape coordinates
    xp = c(1,idx) ;     %// retrieve shape x-values
    yp = c(2,idx) ;     %// retrieve shape y-values
    hp(iShape) = patch(xp,yp,'y','FaceAlpha',0.5) ; %// generate path object and save handle for future shape control.

    if size(c,2) > (nPoints+1)
        %// There is another shape to draw
        c(:,1:nPoints+1) = [] ; %// remove processed points from the contour matrix
        iShape = iShape+1 ;     %// increment shape counter
    else
       %// we are done => exit while loop
       parsed  = true ;
    end
end
grid on

这将产生:

enter image description here