【发布时间】:2017-05-19 00:47:44
【问题描述】:
我用 NaN 填充矩阵中未使用的元素,并且在使用 imagesc 显示数据时,我想为这些具有 NaN 值的元素分配对比色。
下面是一个可能的解决方案的链接,但我不太明白。
http://www.mathworks.com/matlabcentral/newsreader/view_thread/19985
【问题讨论】:
标签: matlab
我用 NaN 填充矩阵中未使用的元素,并且在使用 imagesc 显示数据时,我想为这些具有 NaN 值的元素分配对比色。
下面是一个可能的解决方案的链接,但我不太明白。
http://www.mathworks.com/matlabcentral/newsreader/view_thread/19985
【问题讨论】:
标签: matlab
NaN 值从坐标区颜色图中获取第一种颜色,默认情况下对应于最小值(NaN 除外)。您可以使用CAXIS 函数更改最小值设置轴颜色限制的颜色。要为 NaN 值分配对比色,您可以为 NaN 值添加一种特殊颜色作为第一种颜色(1x3 向量)。
我以你的例子做了一个函数(带有一些 cmets):
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。所以第一种颜色被专门分配给 NaN。
试试这个功能:
a=peaks;
a(a < 0.5) = nan;
imagescwithnan(a,hot,[0 1 1]) %# [0 1 1] is cyan
如果您在函数中注释 ylim 语句(可以通过附加参数控制),此 NaN 颜色将出现在颜色图上。
【讨论】:
像这样使用多个颜色图有 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);
【讨论】:
这个问题首先出现在我的搜索引擎中,但我在this 帖子中找到了更可取的答案,所以我想我会把它包括在这里。
总而言之,使用以下内容:
imagesc(Z,'AlphaData',~isnan(Z))
另外,请注意pcolor 默认忽略nans。
【讨论】: