Matlabは、カラーマップを1つのカラーマップに連結することにより、この問題をきれいに解決する関数newclimのコードを提供しています。このドキュメントは2012bヘルプでしか見つかりませんでしたが、オンラインでは見つかりませんでした。
最後のステップとしてCLimを更新するために使用される軸は、サーフプロットへの軸である可能性があることに注意してください。これが、このコードを適用した方法です。
色制限の計算
この例の鍵は、各サーフェスが適切な色を含むカラーマップのセクションを使用するようにするCLimの値を計算することです。
CLimの新しい値を計算するには、次のことを知る必要があります。
カラーマップの全長(CmLength)
各軸に使用する開始カラーマップスロット(BeginSlot)
各軸に使用する終了カラーマップスロット(EndSlot)
軸に含まれるグラフィックオブジェクトの最小および最大CData値。つまり、CLimModeがauto(CDminおよびCDmax)の場合にMATLABによって決定されるaxesCLimプロパティの値です。
まず、サブプロット領域を定義し、サーフェスをプロットします。
im1 = load('cape.mat');
im2 = load('flujet.mat');
ax1 = subplot(1,2,1);
imagesc(im1.X)
axis(ax1,'image')
ax2 = subplot(1,2,2);
imagesc(im2.X)
axis(ax2,'image')
2つのカラーマップを連結し、新しいカラーマップをインストールします。
colormap([im1.map;im2.map])
CLimの新しい値を計算するために必要なデータを取得します。
CmLength = length(colormap); % Colormap length
BeginSlot1 = 1; % Beginning slot
EndSlot1 = length(im1.map); % Ending slot
BeginSlot2 = EndSlot1 + 1;
EndSlot2 = CmLength;
CLim1 = get(ax1,'CLim'); % CLim values for each axis
CLim2 = get(ax2,'CLim');
CLim値を計算する関数の定義
CLimの新しい値を計算するには、カラーマップの合計サイズに対して各軸で使用するカラーマップの部分を決定し、それに応じてClim範囲をスケーリングする必要があります。これを行うためにMATLAB関数を定義できます。
function CLim = newclim(BeginSlot,EndSlot,CDmin,CDmax,CmLength)
% Convert slot number and range
% to percent of colormap
PBeginSlot = (BeginSlot - 1) / (CmLength - 1);
PEndSlot = (EndSlot - 1) / (CmLength - 1);
PCmRange = PEndSlot - PBeginSlot;
% Determine range and min and max
% of new CLim values
DataRange = CDmax - CDmin;
ClimRange = DataRange / PCmRange;
NewCmin = CDmin - (PBeginSlot * ClimRange);
NewCmax = CDmax + (1 - PEndSlot) * ClimRange;
CLim = [NewCmin,NewCmax];
end
入力引数は、上記の箇条書きで識別されます。この関数は、最初に特定の軸に使用するカラーマップ全体のパーセンテージ(PCmRange)を計算し、次に軸のCData範囲を指定してカラーマップのその部分を使用するために必要なCLim範囲を計算します。最後に、計算されたCLim範囲に必要な最小値と最大値を決定し、これらの値を返します。これらの値は、特定の軸の色の制限です。
関数の使用
newclim関数を使用して、各軸のCLim値を設定します。ステートメント
set(ax1,'CLim',newclim(BeginSlot1,EndSlot1,CLim1(1),...
CLim1(2),CmLength))
サーフェスがカラースロット65〜120を使用するように、最初の軸のCLim値を設定します。点灯しているサーフェスは下部の64スロットを使用します。CLim値もリセットする必要があります。
set(ax2,'CLim',newclim(BeginSlot2,EndSlot2,CLim2(1),...
CLim2(2),CmLength))
関数のしくみ
MATLABでは、Axesに表示されるグラフィックスオブジェクトのCDataにこれらの値が対応していない場合でも、AxesのCLimプロパティに任意の値を指定できます。これらの色に対応するCData値が実際にあるかどうかに関係なく、最小CLim値は常にカラーマップの最初の色にマップされ、最大CLim値は常にカラーマップの最後の色にマップされます。したがって、オブジェクトの実際のCDataの最小値または最大値を超えるCLimの値を指定すると、MATLABはカラーマップのサブセットのみでオブジェクトに色を付けます。
newclim関数は、グラフィックスオブジェクトの実際のCData値を指定した開始および終了のカラーマップスロットにマップするCLimの値を計算します。これは、計算されたCLim値を持つ「仮想」グラフィックスオブジェクトを定義することによって行われます。