Graphics | ![]() ![]() |
例 - Figure内の複数のカラーマップのシミュレーション
同じFigure内に2つの異なるSurfaceを表示し、各Surfaceを異なるカラーマップでカラーリングすると仮定します。2つのカラーマップを連結し、各AxesのCLim
プロパティをカラーマップの異なる部分に写像するように設定することによって、2種類のカラーマップの効果を創り出すことができます。
この例では、同じ地形データから2つのSurfaceを作成します。1つは典型的な地図帳のカラー構成を使用します。すなわち海洋に対しては青のカラーリング、陸に対しては緑のカラーリングを使います。別のSurfaceは立体感を出すために光源を与えて照明します。このような照明には暗い色から明るい色まで単調に変化するカラーマップが必要です。
この例の重要な点は、各Surfaceが適切なカラーを含むカラーマップの一部を使用するように、 CLim
に対する値を計算することです。
CLim
に対する新たな値を計算するためには、以下の内容を把握する必要があります。
CmLength
)BeginSlot
)。EndSlot
)。CData
値、すなわち、CLimMode
がauto
の場合に、MATLABが決定するAxesのCLim
プロパティの値(CDmin
およびCDmax
)。はじめに、サブプロット領域を定義し、Surfaceをプロットします。
ax1 = subplot(2,1,1); view([0 80]) surf(topodata) shading interp ax2 = subplot(2,1,2),; view([0 80]); surfl(topodata,[60 0]) shading interp
2つのカラーマップを連結し、新たなカラーマップを設定します。
colormap([Lightingmap;Atlasmap]);
CLim
に対する新たな値を計算するために必要なデータを求めます。
CmLength = size(get(gcf,'Colormap'),1);% カラーマップの長さ
BeginSlot1 = 1; % スロットの初め
EndSlot1 = size(Lightingmap,1); % スロットの最後
BeginSlot2 = EndSlot1+1;
EndSlot2 = CmLength;
CLim1 = get(ax1,'CLim');% 各軸の対する CLim 値
CLim2 = get(ax2,'CLim');
CLim値を計算するための関数定義
CLim
に対する新たな値を計算すると、カラーマップの合計サイズに関連して各Axesで使いたいカラーマップの一部を決定し、それに応じて、そのClim
範囲をスケーリングします。これを実行するためのMATLAB関数を定義することができます。
function CLim = newclim(BeginSlot,EndSlot,CDmin,CDmax,CmLength) % スロット番号とレンジをカラーマップに変換 PBeginSlot = (BeginSlot - 1) / (CmLength - 1); PEndSlot = (EndSlot - 1) / (CmLength - 1); PCmRange = PEndSlot - PBeginSlot; % 新しいCLim値の最大値と最小値とレンジを決定 DataRange = CDmax - CDmin; ClimRange = DataRange / PCmRange; NewCmin = CDmin - (PBeginSlot * ClimRange); NewCmax = CDmax + (1 - PEndSlot) * ClimRange; CLim = [NewCmin,NewCmax];
前ページの黒丸を付けたリストで、入力引数を確認します。M-ファイルは、はじめに特定のAxesに対して使用したい全カラーマップの割合(PCmRange)を計算し、それから与えられたAxesのCData
範囲に対してカラーマップのその部分を使用するのに必要なCLim
範囲を計算します。最後に、計算したCLim
範囲に必要な最小値と最大値を決定し、これらの値を出力します。これらの値は与えられたAxesに対するカラー範囲です。
M-ファイルの使用
M-ファイルnewclim
を使用して各AxesのCLim
値を設定します。ステートメント
set(ax1,'CLim',new
clim(65,120,clim1(1),clim1(2)))
は、最初のAxesに対するCLim
値を設定し、Surfaceはカラースロット65から120までを使用します。照明が与えられたSurfaceは、その下の64スロットを使用します。そのCLim
値も同様にリセットする必要があります。
set(ax2,'CLim',new
clim(1,64,clim1(1),clim1(2)))
関数機能
MATLABでは、AxesのCLim
プロパティに対する値が、Axesに表示されるグラフィックスオブジェクトのCData
に対応しなくても、それらに任意の値を設定することができます。MATLABは、常に最小のCLim
値をカラーマップの最初のカラーに写像し、最大のCLim
値をカラーマップの最後のカラーに写像しますが、これらのカラーに対応するCData
値が実際に存在するかどうかには関係ありません。従って、オブジェクトの実際のCDataの最小値と最大値を越える値をCLim
に対して設定すると、MATLABはカラーマップを部分的に使ってオブジェクトにカラーリングします。
M-ファイルnewclim
は、グラフィックスオブジェクトの実際のCData
値を、設定した最初と最後のカラーマップスロットに写像する値をCLim
に対して計算します。計算したCLim
値をもつ"仮想"のグラフィックスオブジェクトを定義することによって、これを行います。つぎの図はこの考え方を示したものです。この図では、Surface形状へのカラーの写像を視覚化しやすくするために、2つのSurfaceの側面図を示しています。仮想Surfaceを左側に、実際のSurfaceを右側に示しています。中央にあるのは、Figureのカラーマップです。
実際のSurfaceのCLim
値は[0.4
-0.4]
です。スロット65から120までを使って、このSurfaceにカラーリングするために、newclim
は[0.4
-1.4269]
の新たなCLim
値を計算しています。左側の仮想Surfaceはこれらの値を表しています。
![]() | Axesのカラー範囲 - CLimプロパティ | プロットに使用するLineのカラーの定義 | ![]() |