我使用NaN在矩阵中填充未使用的元素,并且在使用imagesc
显示数据时,我想为具有NaN值的元素指定对比色。
以下是可能解决方案的链接,但我不太明白。
http://www.mathworks.com/matlabcentral/newsreader/view_thread/19985
答案 0 :(得分:16)
NaN值从轴色彩图获得第一种颜色,默认情况下对应于最小值(NaN除外)。您可以使用CAXIS功能更改最小值设置轴颜色限制的颜色。要为NaN值指定对比色,您可以为NaN值添加一种特殊颜色作为第一种颜色(1x3向量)。
我拿你的例子做了一个函数(带了一些注释):
function [h hcb] = imagescwithnan(a,cm,nanclr)
% IMAGESC with NaNs assigning a specific color to NaNs
%# find minimum and maximum
amin=min(a(:));
amax=max(a(:));
%# size of colormap
n = size(cm,1);
%# color step
dmap=(amax-amin)/n;
%# standard imagesc
him = imagesc(a);
%# add nan color to colormap
colormap([nanclr; cm]);
%# changing color limits
caxis([amin-dmap amax]);
%# place a colorbar
hcb = colorbar;
%# change Y limit for colorbar to avoid showing NaN color
ylim(hcb,[amin amax])
if nargout > 0
h = him;
end
此处caxis语句将颜色映射的第一种颜色分配给最小值amin
,但分配给amin-dmap
。所以第一种颜色专门分配给NaNs。
尝试使用以下功能:
a=peaks;
a(a < 0.5) = nan;
imagescwithnan(a,hot,[0 1 1]) %# [0 1 1] is cyan
如果你在函数中注释ylim语句(可以使用附加参数进行控制),这个NaN颜色将在colormap上。
答案 1 :(得分:2)
使用多个颜色贴图有两个常规步骤:
这将成功将新数据映射到新的色彩映射,同时将旧数据映射到旧色彩映射(即不改变旧数据的颜色)。另请注意,数据的副本会以存储图像,因此我们可以在不改变原始值的情况下进行此移位。
简化示例:
% Make image data
img = -5:5;
% Plot with original colormap
figure
imagesc(img);
colormap(hot(8))
% Add in an NaN
img(3) = NaN;
% Make new colormap
n = 8;
cols = [0 0 1 %blue
hot(n)];
% Plot with new colormap
figure
h = imagesc(img);
colormap([0 0 1; hot(8)])
% Scale data so that the range proportions match the colormap sizes
cdata = get(h, 'CData');
img_range = range(cdata(:));
cdata(isnan(cdata)) = min(cdata(:)) - img_range/n;
set(h, 'CData', cdata);
答案 2 :(得分:1)
这个问题首先出现在我的搜索引擎中,但我在this帖子中找到了一个更优选的答案,所以我想我会把它包含在这里。
总之,请使用以下内容:
imagesc(Z,'AlphaData',~isnan(Z))
或者,请注意pcolor
默认忽略nan
。