我有两个类别的2d概率质量函数。我试图绘制轮廓以使它们可视化(例如在它们的半高处,但并不重要)。
我不想直接使用contourf
绘图,因为我想控制填充颜色和不透明度。所以我使用contourc
生成xy坐标,然后使用fill
和这些xy坐标。
问题是来自contourc
函数的xy坐标中有奇怪的数字,这会导致绘制下面的奇怪顶点。
起初我认为这是奇怪的contourmatrix格式,但我不认为这是因为我只要求contourc
中的一个值。例如......
contourmatrix = contourc(x, y, Z, [val, val]);
h = fill(contourmatrix(1,:), contourmatrix(2,:), 'r');
当我只要求一个轮廓时,是否有人知道为什么contourmatrix
中有这些奇数值?
更新
当输入的2D矩阵不是“平滑”时,我的问题似乎可能是contourc
的失败模式。我的源数据是一大组(x,y)点。然后我创建了一个带有一些hist2d函数的2D矩阵。但是当这很吵时,这个问题就被夸大了......
但是当我使用2d内核密度函数来产生更平滑的2D功能时,问题就会减少......
完整的过程是
a)我有一组(x,y)点,它们来自分布
b)我将其转换为2D pmf
c)使用contourc
创建一个等值线矩阵
d)使用fill
答案 0 :(得分:1)
您的图形故障是由于您使用ContourMatrix
中的数据的方式。即使您只指定了一个isolevel,也会导致几个不同的填充区域。因此ContourMatrix
可能包含多种形状的数据。
简单的例子:
isolevel = 2 ;
[X,Y,Z] = peaks ;
[C,h] = contourf(X,Y,Z,[isolevel,isolevel]);
产地:
请注意,即使您只指定了一个要绘制的等级,也会产生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) ;
会产生同样的故障:
现在,如果在不包含定义列的情况下正确提取每个形状坐标,则可以获得正确的形状。下面的示例是提取和绘制每个形状以获取灵感的一种方法,但它们有很多种方式可以区别对待。你当然可以压缩代码很多,但在这里我详细说明了操作。
关键是要阅读并理解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
这将产生: