【发布时间】:2013-03-16 21:03:36
【问题描述】:
我正在尝试制作contourf 绘图,但数据数组的某些区域具有 NaN(仅在数据矩阵中,x 和 y 网格矩阵已满)。我希望这些 NaN 是透明的,它们用于矩形边界上的 NaN。但是,数据矩阵内的连续 NaN 区域是白色的,而不是透明的。下面是一个例子:
代码:
[X Y] = meshgrid(10:50);
Z = X.*Y;
Z(10:30,10:30) = NaN;
figure
imshow(uint8(repmat(1:4:240,[60,1,3])));
hold on;
contourf(X,Y,Z);
colormap jet;
输出:
提示:
在上面的代码后面加上:
% Find Face
set(findobj(h,'FaceColor',[1 1 1]),'FaceAlpha',0))
将找到白色补丁对象并将其设置为透明。不幸的是,下面的补丁已满:
更新:获取NaN 区域并叠加背景图像结果:
如您所见,它并没有覆盖整个图像。如果我使用imdilate,它会去除白色区域,但同时也会破坏黑色边框以及一点点数据。
【问题讨论】:
-
你能给出一个重现这个错误的示例代码吗?
-
如果您查看代码 (
edit contourf) 并搜索isnan,您就会明白为什么会发生这种情况 - 在内部,该函数将nans转换为一个特殊值,然后使用它像所有其他人一样绘制一个补丁。由于补丁是堆叠的,因此在该补丁上设置透明度只会让您得到它下面的那个,而不是一直到背景图像。您最好的选择可能是适当地裁剪/遮盖背景图像,然后将其重新显示在countourf图上方。 -
@tmpearce 是的,我试过了。它存在一些问题,无法完美对齐。我将把我得到的问题附加到问题中。如果我可以直接在白色
patch上设置图像,那就太好了。 -
我想我可以通过首先将 NaN 转换为一个非常高的数字,进行绘图,然后删除相关补丁来使其工作 - 如果这不起作用,请尝试与将 NaN 转换为非常低的数字相反。您会想象 NaN 补丁会以一种或另一种方式出现在堆栈的底部 - 您只需要安排数据以确保这一点。但是...快速尝试一下,看起来堆栈中 NaN 补丁的位置可能取决于数据中 NaN 的位置。但这种方法可能值得研究?
-
尝试使用文件交换中的patchTexture 将您的纹理(图像)映射到白色补丁上(因为您已经识别了它)。