我正在尝试制作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
它会消除白色区域,但同时也会破坏黑色边框以及一些数据。
答案 0 :(得分: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倍才能获得相当平滑的图像。
答案 1 :(得分: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;