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

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

(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の指定が面倒になったり,デメリット多し.

(3)plotbox内の背景色を変える

NaNのところは着色されず,背景色が映ることを利用する.

whitebg(ColorSpec)

で背景色の変更ができる.ただし,whitebgはplotbox外の背景色と,色によっては軸ラベルの色も自動で変わってしまうため,上記を実行した後に,

fig = gcf
fig.Color = 'w' % set(gcf,'Color','w')でも可
set(gca,'XColor','k','YColor','k')

を実行し,対象領域以外を元に戻す.
また,これだけではfigureを保存しても反映されないので

fig.InvertHardcopy = 'off';

を指定する.
whitebgは,clearをしても効かない.保存が終わって別プログラムを実行する際には

whitebg('w')

で白に設定することができる.
デフォルトの背景色は完全な白ではないため.変える前にRGBを確認をした方が良い.


Front page   Edit Diff Attach Copy Rename Reload   New List of pages Search Recent changes   Help   RSS of recent changes
Last-modified: 2017-04-14 (Fri) 04:57:04 (189d)