13

我正在尝试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它会消除白色区域,但同时也会破坏黑色边框以及一些数据。

4

2 回答 2

5

基于 H. Muster 的回答,我通过分割数据人为地创建了波段(您可以使用一个简单的函数来选择波段,或者contour在虚拟人物上创建它们,返回它们,然后重新使用它们)。

[X Y] = meshgrid(10:0.1:50);
Z = X.*Y;
Z(100:300,100:300) = NaN;
figure
hold on;
h = pcolor(X,Y,round(Z/500)*500);
set(h,'Edgecolor',  'interp');
colormap jet;
set(gca, 'XLim', [0 60], 'YLim', [0 60]);

恐怕我没有包含的工具箱,imread因此无法显示底层渐变,但我认为这会起作用。我必须将分辨率提高 10 倍才能获得相当平滑的图像。

在此处输入图像描述

于 2013-04-09T05:45:04.953 回答
4

是否可以使用pcolor而不是contourf

[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;
h = pcolor(X,Y,Z)
set(h,'Edgecolor',  'interp');
colormap jet;

在此处输入图像描述

于 2013-04-08T07:31:56.610 回答