平面図の特定部分のマスキング

pcolor,contourfなどで着色した2次元の平面分布図を書き,さらに特定の部分だけ別の基準で塗りつぶし(ハッチング?)をしたい時に.
以下の2つの案はどちらも課題が残りすっきりしない.

(1)patchで各メッシュを塗りつぶす

描画をする2次元配列をA(i,j)とする.Aは,

A(A<0) = NaN;

などの処理によって,特定の値や範囲がNaNへ変換されていると仮定する.
以下のようにすると,NaNとなった部分はpcolorやcontourfなどとは別に色をつけることができる.

ind = find(isnan(A));
np = length(ind);
faces = zeros(np,4);
vertices = zeros(4*np,2);
for k = 1:np
  [i,j] = ind2sub(size(A),ind(k));
  faces(k,:) = 4*(k-1)+1:4*k;
  vertices(4*(k-1)+1:4*k,:) = [j  ,i  ;j+1,i  ;j+1,i+1;j  ,i+1];  
end
patch('Faces',faces,'Vertices',vertices,'FaceColor','k','EdgeColor','None');

色はお好みで.
変数verticesには着色するメッシュの4つの頂点,facesには4つの頂点からなる面の指定をしている.
verticesに格納しているj,iなどは,図よってはj-0.5,i-0.5とした方が良いかもしれない.
patchによる着色は,pcolorなどの後にあれば,hold on,hold offをしなくても上塗りされる(少なくとも2015b時点では).
この方法による問題点は,quiverなどの矢印もpatchの裏に埋もれてしまうことである.

patch(...,'FaceAlpha',0.5)

で透明度を指定してオーバーラップしているように見せるというのが苦肉の策.

(2)colormapの上端か下端に色を追加する

力技として,RGBが指定されたn行3列の配列の上端か下端に,つけたい色のRGBを挿入するという方法がある.
例えば組み込みのcolormapであるjetを使う場合,

cmap = jet;
cmap(end,:) = [0.5,0.5,0.5];
colormap(cmap)

とすることでcaxisの上端に灰色が入る.
あとは,(1)でNaNにしたように,

A(A<0) = Inf;

と,着色したいものがcaxisのrangeに入らないよう指定する.
この方法であれば,quiverをオーバーラップさせることも可能.
ただし,colorbarの表示に追加した色が含まれてしまったり,特にcontourfではcaxisのrangeの指定が面倒になったり,デメリット多し.


Front page   Edit Diff Attach Copy Rename Reload   New List of pages Search Recent changes   Help   RSS of recent changes
Last-modified: 2017-11-08 (Wed) 20:16:19 (34d)