web-dev-qa-db-ja.com

matlabで「カラーマップ」プロットを作成するにはどうすればよいですか?

Matlab形式で保存されたいくつかのデータ(2つのパラメーターの関数)があり、matlabを使用してプロットしたいと思います。データを読み込んだら、mesh()を使用してプロットを作成します。 mesh()プロットは、次のように、関数の値を色と表面の高さで示します。

A color and a surface height as a function of two independent variables.

従属変数が色のみとして表される2Dメッシュプロットを作成するには、どのmatlabプロット関数を使用する必要がありますか? gnuplotでpm3d mapのようなものを探しています。

28
Dan

デフォルトでは、meshは(デフォルト)jetカラーマップに基づいて表面の値を色付けします(つまり、ホットが高い)。さらに、塗りつぶされた表面パッチにsurfを使用し、'EdgeColor'プロパティを'None'に設定できます(したがって、パッチのエッジは見えません)。

[X,Y] = meshgrid(-8:.5:8);
R = sqrt(X.^2 + Y.^2) + eps;
Z = sin(R)./R;

% surface in 3D
figure;
surf(Z,'EdgeColor','None');

enter image description here

2Dマップ:Figureのviewプロパティを切り替えることで2Dマップを取得できます

% 2D map using view
figure;
surf(Z,'EdgeColor','None');
view(2);    

enter image description here

...またはZの値をマトリックスとして扱い、imagescを使用してスケーリングされたイメージとして表示し、適切な colormap を選択します。

% using imagesc to view just Z
figure;
imagesc(Z); 
colormap jet; 

enter image description here

マップのカラーパレットは、colormap(map)によって制御されます。mapは、カスタムまたはMATLABが提供する組み込みカラーマップのいずれかです。

enter image description here

マップの更新/調整:マップ上のいくつかの設計オプション(解像度、スムージング、軸など)は、通常のMATLABオプションで制御できます。 @Florisが指摘しているように、この例に適合した、平滑化された等軸、無軸のラベルマップがあります。

figure;
surf(X, Y, Z,'EdgeColor', 'None', 'facecolor', 'interp');
view(2);
axis equal; 
axis off;

enter image description here

42
gevang

gevangの答えは素晴らしいです。 pcolorを使用してこれを直接行う別の方法もあります。コード:

[X,Y] = meshgrid(-8:.5:8);
R = sqrt(X.^2 + Y.^2) + eps;
Z = sin(R)./R;
figure;
subplot(1,3,1);
pcolor(X,Y,Z); 
subplot(1,3,2);
pcolor(X,Y,Z); shading flat;
subplot(1,3,3);
pcolor(X,Y,Z); shading interp;

出力:

enter image description here

また、以下に示すように、pcolorもフラットです(pcolorは2Dベースです。上の3D図はmeshを使用して生成されます)。

enter image description here

19
Justin

Pcolorと "surf + view(2)"の両方が、2Dデータの最後の行と最後の列を表示しないことに注意してください。

一方、imagescを使用する場合は、軸に注意する必要があります。 2Dのsinc関数は対称であるため、gevangの答えのみ(ほとんど-最後の行と列を除く)のsurfとimagescの例は互いに対応しています。

これらの2つのポイントを説明するために、次のコードを使用して以下の図を作成しました。

[x, y] = meshgrid(1:10,1:5);
z      = x.^3 + y.^3;

subplot(3,1,1)
imagesc(flipud(z)), axis equal tight, colorbar
set(gca, 'YTick', 1:5, 'YTickLabel', 5:-1:1);
title('imagesc')

subplot(3,1,2)
surf(x,y,z,'EdgeColor','None'), view(2), axis equal tight, colorbar
title('surf with view(2)')

subplot(3,1,3)
imagesc(flipud(z)), axis equal tight, colorbar
axis([0.5 9.5 1.5 5.5])
set(gca, 'YTick', 1:5, 'YTickLabel', 5:-1:1);
title('imagesc cropped')

colormap jet

surf vs imagesc

ご覧のとおり、サーフプロットでは10行5列が欠落しています。 (これは他の回答の画像でも見ることができます。)

「set(gca、 'YTick' ...」(およびXtick)コマンドを使用して、xとyが1:1:Nでない場合にxとyの目盛りラベルを適切に設定する方法に注意してください。

また、imagescは、zデータがxsとysに対応し、(それぞれ)等間隔である場合にのみ意味があることに注意してください。そうでない場合は、surfを使用できます(そして最後の列と行ともう1つの「(end、end)」値を複製できます-これは一種の汚いアプローチですが)。

5
stack_horst

contourf(Z)を使用することもお勧めします。私の問題については、3Dヒストグラムを2Dで視覚化したかったのですが、輪郭が滑らかすぎて、ヒストグラムバーの上面を表すことができませんでした。

したがって、私の場合、jucestainの答えを使用することを好みます。 pcolor()のデフォルトshading facetedがより適しています。ただし、pcolor()は、プロットされたマトリックスの最後の行と列を使用しません。このために、padarray()関数を使用しました。

pcolor(padarray(Z,[1 1],0,'post'))

それが元の投稿と実際に関連していない場合は申し訳ありません

2
Hazem