web-dev-qa-db-ja.com

Matlabは滑らかな等高線図を作成する方法?

2つの変数を持つデータを2D形式で表現したい。値は色で表され、2つの変数が2つの軸として表されます。データをプロットするために関数contourfを使用しています。

clc; clear;

load('dataM.mat')

cMap=jet(256); %set the colomap using the "jet" scale
F2=figure(1);
[c,h]=contourf(xrow,ycol,BDmatrix,50);
set(h, 'edgecolor','none');

xlim([0.0352 0.3872]);
ylim([0.0352 0.3872]);

colormap(cMap);
cb=colorbar;
caxis([0.7 0.96]);
% box on;
hold on;

Xrowとycolはどちらも、座標を表す6x6行列です。 BDmatrixは、対応するデータを表す6x6マトリックスです。しかし、私が得るのはこれです:

enter image description here

以下は、xrowとyrowのマティックスです。

enter image description here

以下は、BDmatrix maticesです。

enter image description here

データポイントを結ぶ直線として表示されるのではなく、輪郭の色が滑らかに変化することは可能ですか?この図の問題は、魅力的でない粗い粒度です。私はcontourfをimagecで置き換えようとしましたが、機能していないようです。私はMATLAB R2015bを使用しています。

7
Kelvin S

データを補間できます。

newpoints = 100;
[xq,yq] = meshgrid(...
            linspace(min(min(xrow,[],2)),max(max(xrow,[],2)),newpoints ),...
            linspace(min(min(ycol,[],1)),max(max(ycol,[],1)),newpoints )...
          );
BDmatrixq = interp2(xrow,ycol,BDmatrix,xq,yq,'cubic');
[c,h]=contourf(xq,yq,BDmatrixq);

パラメータnewpointsを使用して、新しいプロットの「滑らかさ」を選択します。

Plot sample

カラーエッジを減らすには、値のステップ数を増やします。デフォルトでは、これは10です。次のコードは、値ステップの数を50に増やします。

 [c,h]=contourf(xq,yq,BDmatrixq,50);

Sample fine

3Dサーフプロットは、非常に滑らかなカラーシェーディングに適しています。回転して、真上からのビューにします。また、サーフプロットは、多くの値ステップを持つコンタープロットよりもはるかに高速です。

 f = figure;
 ax = axes('Parent',f);
 h = surf(xq,yq,BDmatrixq,'Parent',ax);
 set(h, 'edgecolor','none');
 view(ax,[0,90]);
 colormap(Jet);
 colorbar;

Sample smooth

注1:3次補間は形状を保持しません。つまり、補間された形状は、元のBDmatrixの最大値よりも大きい最大値(および小さい最小値)を持つことができます。 BDmatrixにノイズのある値がある場合、補間が正しく行われていない可能性があります。

注2:xrowyrowを生成した場合自分で(そして制限を知っている)、私がしたようなmin-max-extractionは必要ありません。

注3:データマトリックスのスクリーンショットを元の投稿に追加した後、 xrowおよびycolndgridジェネレーターから取得されます。したがって、一貫性を保つために、ここでもこれを使用する必要があります。 interp2にはmeshgridが必要ですgriddedInterpolantに切り替える必要があります:

[xq,yq] = ndgrid(...
            linspace(min(min(xrow,[],1)),max(max(xrow,[],1)),newpoints ),...
            linspace(min(min(ycol,[],2)),max(max(ycol,[],2)),newpoints )...
          );
F = griddedInterpolant(xrow,ycol,BDmatrix,'cubic');
BDmatrixq = F(xq,yq);
9
Loamsiada