0

同じサイズの行列 A と B が 2 つあります。それぞれがいくつかの場所で NaN を含むことができます。次の方法で、A と B の差の尺度 C を視覚化します。

C = (A - B) ./ ((A + B) ./ 2) ;

figure(1); clf;

imagesc(C); colorbar;

現在のプレゼンテーションを次のように変更したいと思います。

  1. isnan(A(i,j)) と ~isnan(B(i,j)) の場合 ---> カラーマップで白
  2. ~isnan(A(i,j)) と isnan(B(i,j)) の場合 ---> カラーマップで黒
  3. isnan(A(i,j)) と isnan(B(i,j)) の場合 ---> カラーマップで灰色
  4. それ以外の場合 ---> C(i,j) の値に応じた色 [現状のまま]

上記の色は、区別できる限り重要ではありません。

似たようなアイデアがありますが (たとえば、 here )、必要なものとはまったく異なります...何かアイデアはありますか?

どうもありがとう!!!

4

1 に答える 1

1

おそらくもっと良い解決策があるかもしれませんが、ここで解決策を見つけることができます。基本的に、画像を表示するために画像の RGB 表現を作成しています。そこで、最初に必要な色の数でカラーマップを選びました。次に、データからインデックスに変換しin2rgb()、RGB イメージを取得するために使用します。次に、各色のビン サイズを取得し、カラー バーに適切なラベルを付けることができます。プロットの例

% Randomly generate some data for demonstration
A = [1 nan nan; 1 2 3; 4 5 6];
B = [nan 0 nan; 4 3 2; 1 2 1];
C = (A - B) ./ ((A + B) ./ 2);

% Number of colors you want to use
ncolor = 8;
data_colormap = [jet(ncolor); 1 1 1; 0 0 0; 0.5 0.5 0.5];
data_range = [min(C(:)) max(C(:))];
data_ind = (C - data_range(1)) / (data_range(2) - data_range(1)) * (ncolor - 1) + 1;

% Assign indices > ncolor for the special cases
data_ind(isnan(A)) = ncolor + 1;            % isnan(A) assign to white
data_ind(isnan(B)) = ncolor + 2;            % isnan(A) assign to black
data_ind(isnan(A) & isnan(B)) = ncolor + 3; % isnan(A) + isnan(B)

% Get the RGB representation
img = ind2rgb(round(data_ind), data_colormap);
imagesc(img)

% Custom labels for the colorbar
bin_size = (data_range(2)-data_range(1)) / ncolor;
caxis([data_range(1) data_range(2) + 3*bin_size])
colormap(data_colormap)
ax = colorbar;
yticks = get(ax, 'YTick');
yticks = yticks(yticks < data_range(2));
yticklabels = num2cell(yticks);

% Pad another 3 custom labels
yticks = [yticks, data_range(2)+[bin_size 2*bin_size 3*bin_size]-0.5*bin_size];
yticklabels = [yticklabels 'isnan(A)', 'isnan(B)', 'both'];

set(ax, 'YTick', yticks, 'YTickLabel', yticklabels)
于 2013-08-11T16:52:54.640 に答える