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

はじめに

pcolorやcontourfは,複数のcolormapを使って重ねた表示をするのが難しい.
特定の部分だけ別の基準で塗りつぶし(ハッチング?)をしたい時に.
適当にデータを用意しておく.

Untitled
clear
close all
% sample data
n = 501;
[x,y,z] = peaks(n);
今回は,peaks で作成された配列 z の中から一部をくりぬき,colormap(parula) とは別の色をつけることを考える.
2手法でやってみた.下記の手法は,配列の要素数が少ないと図が不細工になるため要素数が十分大きい (解像度が細かい) 場合に限る.
例えば z<-4 または 6<z の範囲を異なる色で着色するとして,まず該当範囲をNaNにして描いてみる.
% thresholds
z(z<-4|6<z) = NaN;
% figure
figure
contourf(x,y,z,-4:6);hold on
axis equal tight
上図の NaN の白抜き部分を塗りつぶすために,patch のデータを作成する.

方法① patch で塗りつぶす

下記の操作は,NaN になっている部分を頂点と面のデータへ変換している.
xvec = x(1,:);
yvec = y(:,1);
dx = xvec(2)-xvec(1);
dy = yvec(2)-yvec(1);
% count the number of NaN
ind = find(isnan(z));
% preallocate
np = length(ind);
faces = zeros(np,4);
vertices = zeros(4*np,2);
% data for patch
for k = 1:np
[i,j] = ind2sub(size(z),ind(k));
faces(k,:) = 4*(k-1)+1:4*k;
vertices(4*(k-1)+1:4*k,:) = [xvec(j)-0.5*dx ,yvec(i)-0.5*dy; ...
xvec(min(j+1,n))-0.5*dx,yvec(i)-0.5*dy; ...
xvec(min(j+1,n))-0.5*dx,yvec(min(i+1,n))-0.5*dy; ...
xvec(j)-0.5*dx ,yvec(min(i+1,n))-0.5*dy];
end
% overlay
patch('Faces',faces,'Vertices',vertices,'FaceColor',[.7,.7,.7],'FaceAlpha',0.5,'EdgeColor','None');
変数 vertices には着色するメッシュの4つの頂点,faces には4つの頂点からなる面の指定をしている.
patch による着色は,pcolor などの後にあれば,hold on, hold off をしなくても上塗りされる.
quiver などの矢印も patch の裏に埋もれてしまうので,同時に表示する場合は透過度 (FaceAlpha, 0〜1) を小さくする.

方法② colormap の上端か下端に色を追加する

RGB が指定された n行3列の配列の上端か下端に,つけたい色の RGB を挿入するという力技がある.
例えば組み込みの colormap である parula を使う場合,
[x,y,z] = peaks(n);
z(z<-4|6<z) = -4-1e-5;
figure
% edit colormap
cmap = colormap(parula(10));
cmap = vertcat([.9,.9,.9],cmap);
% contourf
contourf(x,y,z,-5:6);hold on
caxis([-5 6])
colormap(cmap);
% format colorbar
cb = colorbar;
cbl = cb.TickLabels;
cbl{1} = '';
cb.TickLabels = cbl;
contourf と patch を使った①と似たような図が作成できた.この方法であれば,quiverをオーバーラップさせることも可能.
ただし,colorbar の表示に追加した色が含まれてしまったり,特に contourf では caxis の range の指定が面倒になったりする.

参考 MathWorks公式


Front page   Edit Diff Attach Copy Rename Reload   New List of pages Search Recent changes   Help   RSS of recent changes
Last-modified: 2018-07-23 (Mon) 02:20:36 (583d)