【问题标题】:Contrasting color for NaNs in imagescimagesc 中 NaN 的对比色
【发布时间】:2017-05-19 00:47:44
【问题描述】:

我用 NaN 填充矩阵中未使用的元素,并且在使用 imagesc 显示数据时,我想为这些具有 NaN 值的元素分配对比色。

下面是一个可能的解决方案的链接,但我不太明白。

http://www.mathworks.com/matlabcentral/newsreader/view_thread/19985

【问题讨论】:

    标签: matlab


    【解决方案1】:

    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】:

      像这样使用多个颜色图有 2 个一般步骤:

      1. 将新颜色图与旧颜色图叠加。
      2. 将要映射到此新颜色图的新值移动,以使范围(新数据)与范围(旧数据)的比率与 nrow(新颜色图)与 nrow(旧颜色图)的比率相同。

      这将成功地将新数据映射到新颜色图,同时将旧数据映射到旧颜色图(即不改变旧数据的颜色)。另请注意,数据的副本图像一起存储,因此我们可以在不改变原始值的情况下进行这种移动。

      一个简化的例子:

      % 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);
      

      【讨论】:

        【解决方案3】:

        这个问题首先出现在我的搜索引擎中,但我在this 帖子中找到了更可取的答案,所以我想我会把它包括在这里。

        总而言之,使用以下内容:

        imagesc(Z,'AlphaData',~isnan(Z))
        

        另外,请注意pcolor 默认忽略nans。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-08
          • 1970-01-01
          • 2014-07-10
          • 2016-10-19
          • 2013-12-27
          • 1970-01-01
          相关资源
          最近更新 更多