3

当使用 imagesc 可视化包含 NaN 值的数据时,Matlab 将它们视为最小值(在灰色中,它将它们涂成黑色、深蓝色等)。喷射颜色图既不包含黑色也不包含白色。是否可以将 nan 值显示为黑色/白色?例如:

data = [0 0 0 ; .5 .5 .5 ;1 1 1;nan nan nan];

应该产生蓝绿红黑条。

谢谢

4

3 回答 3

12

我编写了一个自定义函数来将NaN值显示为透明,即 alpha 值为 0。

function h = imagesc2 ( img_data )
% a wrapper for imagesc, with some formatting going on for nans

% plotting data. Removing and scaling axes (this is for image plotting)
h = imagesc(img_data);
axis image off

% setting alpha values
if ndims( img_data ) == 2
  set(h, 'AlphaData', ~isnan(img_data))
elseif ndims( img_data ) == 3
  set(h, 'AlphaData', ~isnan(img_data(:, :, 1)))
end

if nargout < 1
  clear h
end

因此,NaNs 将显示与图形背景颜色相同的颜色。如果删除 line axis image off,则NaNs 将显示与轴背景颜色相同的颜色。该函数假定输入图像的大小为n x m(单通道)或n x m x 3(三通道),因此可能需要根据您的使用进行一些修改。

使用您的数据:

data = [0 0 0 ; .5 .5 .5 ;1 1 1;nan nan nan];
imagesc2(data);
axis on
set(gca, 'Color', [0, 0, 0])

在此处输入图像描述

于 2013-02-18T11:59:20.987 回答
1
function imagescnan(IM)
% function imagescnan(IM)
% -- to display NaNs in imagesc as white/black

% white
nanjet = [ 1,1,1; jet  ];
nanjetLen = length(nanjet); 
pctDataSlotStart = 2/nanjetLen;
pctDataSlotEnd   = 1;
pctCmRange = pctDataSlotEnd - pctDataSlotStart;

dmin = nanmin(IM(:));
dmax = nanmax(IM(:));
dRange = dmax - dmin;   % data range, excluding NaN

cLimRange = dRange / pctCmRange;
cmin = dmin - (pctDataSlotStart * cLimRange);
cmax = dmax;
imagesc(IM);
set(gcf,'colormap',nanjet);
caxis([cmin cmax]);
于 2015-02-26T02:34:18.730 回答
0

我可以看到实现这一目标的两种可能方法:

a) 修改 jet 颜色图,使其最小值为黑色或白色,例如:

cmap = jet;
cmap = [ 0 0 0 ; cmap ];  % Add black as the first color

缺点是如果您使用此颜色图显示没有nan值的数据,最小值也会以黑/白显示。

b) 使用File Exchange 中的scimagesc ,它将绘图渲染为 RGB 图像。这更加灵活,因为一旦您拥有 RGB 图像,您就可以随心所欲地对其进行操作,包括更改所有nan值。例如:

im = sc(myData);
im(repmat(isnan(myData), [ 1 1 3 ]) ) = 0;  % Set all the nan values in all three 
                                            % color channels to zero (i.e. black)
于 2013-02-18T09:44:24.560 回答