平面図の特定部分のマスキング †はじめに †pcolorやcontourfは,複数のcolormapを使って重ねた表示をするのが難しい. 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公式 † |