当使用 imagesc 可视化包含 NaN 值的数据时,Matlab 将它们视为最小值(在灰色中,它将它们涂成黑色、深蓝色等)。喷射颜色图既不包含黑色也不包含白色。是否可以将 nan 值显示为黑色/白色?例如:
data = [0 0 0 ; .5 .5 .5 ;1 1 1;nan nan nan];
应该产生蓝绿红黑条。
谢谢
我编写了一个自定义函数来将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
因此,NaN
s 将显示与图形背景颜色相同的颜色。如果删除 line axis image off
,则NaN
s 将显示与轴背景颜色相同的颜色。该函数假定输入图像的大小为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])
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]);
我可以看到实现这一目标的两种可能方法:
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)