2

2014 年より前のバージョンの matlab では、次の操作を行うことで、カラーバーの基になる画像を変更できました。

cmap = ... % something which is MxNx3
colormap(reshape(cmap, [N*M,3]))
cmapIxs2D = reshape((1:(N*M))', [N, M]);
ax = colorbar('peer', gca);
set(get(ax, 'Children'), 'CData', cmapIxs2D);
ylim(ch, [0 255]), xlim(ch, [0 1])

これは、通常の 1D (Nx3) ではなく 2D (NxMx3) などのカスタム カラーマップを表示する場合に便利でした。ドキュメントによると、カラーバーの基になる画像にアクセスできなくなった2014年以降のバージョンでこれを行うにはどうすればよいでしょうか。

例 (色の値は、たとえば速度 (y 軸の色) と加速度 (x 軸の色) を持つと解釈されます):

ここに画像の説明を入力

4

1 に答える 1

1

OPコメントで提案されたアイデアに基づいて、私は何かを思いつきました:

function q38871518
%% Plot something random:
hF = figure('Color',0.4*[1 1 1],'SizeChangedFcn',@recolorCB); membrane;
hTmp = gca;
% Compute the fake colorbar contents:
cm = bsxfun(@times,permute(colormap,[1,3,2]),0:0.01:1); % figure(); imagesc(cm);
% Create an axes to hold the fake colorbar
hAx = axes(hF); imagesc(hAx,cm); axis(hAx,'off'); 
function recolorCB(varargin)
  drawnow;
  if exist('cb','var')
    cb.Face.Texture.CData(:) = 0;
    % "Link" the 'Position' prop between the colorbar and the fake colorbar:
    hAx.Position = cb.Position;
  end
end
% Create the real colorbar 
cb = colorbar(hTmp,'Color',[1 1 1]);
% Synchronize positions:
hAx.Position = cb.Position;
% Make sure the fake colorbar is at the bottom, so we can see the values clearly
uistack(hAx,'bottom');
% Final touch-ups:
drawnow; cb.Face.Texture.CData(:) = 0; cb.Face.Texture.ColorType = 'truecoloralpha';
end

結果は次のとおりです。

ここに画像の説明を入力

Figure のサイズが変化すると、「偽の」カラーバーが正しい位置に移動します。Figure を保存すると、古いカラー バーが表示されます。これは、ズーム アウトした後も発生します (おそらく他の操作を行った後)。これを取り除くには、追加のハッキングが必要になります...

MATLAB R2016a でテスト済み。

于 2016-08-11T11:36:17.800 に答える