3

以下のような表面プロットが欲しいのですが、適切なカラーバーが付いています。

カラーバーなしでプロット

これは私のコードです:

[X,Y,Z] = peaks(30);

[maxval dummy] = max(Z(:));
[minval dummy] = min(Z(:));

crange = 1.5;

% red, yellow, green
cmap = [1 0 0; 1 1 0; 0 1 0];  
colormap(cmap); 

colors = zeros(size(Z));                   
colors(Z <= -crange) = 1;              % red (1)
colors(Z > -crange & Z < crange) = 2;  % yellow (2)
colors(Z >= crange) = 3;               % green (3)

surf(X,Y,Z, colors);
axis([-3 3 -3 3 -10 10]);

%cbh = colorbar('YGrid','on');    
%caxis([minval-0.1 maxval+0.1]);
%set(cbh,'YTick',[minval -crange crange maxval]);

これまでのところ、カスタム範囲(緑[8 ... 1.5]、黄[1.5 ... -1.5]、赤[-]に従って色(緑、黄、赤)が整列するカラーバーを追加することはできませんでした。 1.5 ... -6.4])。代わりに、最後の3行のコメントを外すと、線形に整列された色のカラーバーが表示され、プロットの色はカスタム範囲ではなくカラーバーに従って整列されます。

カラーバーでプロット

さて、私が欲しいのは、カラーバーの色が私のカスタムティックと一致し、プロットが最初の写真のように見えることです。

4

3 に答える 3

4

問題は、サーフプロットの各ポイントの色を自分で指定するため、デフォルトのようにz値に関連付けられていないことです。そのためのカラーバーは、1〜3のカラー番号のみに基づいて作成されます。したがって、これらは、カラーバーのデフォルトの目盛りとしても表示されます(変更する前)。

あなたが知っているように、あなたは手動で目盛りを設定することができます、そして同じ方法であなたは「チート」して使うことができますyticklabels

figure
colormap(cmap); 
surf(X,Y,Z, colors);
axis([-3 3 -3 3 -10 10]);

cbh = colorbar('YGrid','on');
set(cbh,'ytick',linspace(1,3,4));
set(cbh,'yticklabel',arrayfun(@num2str,[minval -crange crange maxval],'uni',false));

ここに画像の説明を入力してください

または、単にを使用する別の方法ですがcaxis、プロットの色は最小値によって線形に定義されます。したがって、これでは非線形範囲を設定できません。
図:

figure
colormap(cmap); 
surf(X,Y,Z);
axis([-3 3 -3 3 -10 10]);
caxis([minval-0.1 maxval+0.1]);
cbh=colorbar
set(cbh,'YTick',[minval -crange crange maxval]);

ここに画像の説明を入力してください

結局のところ、私の最初の方法(yticklabelsを使用)があなたが望むことをする唯一の方法だと思います。

于 2012-11-17T14:10:14.413 に答える
0

私が抱えていた問題の解決策を見つけたときに、この質問に出くわしました。とにかく、この質問は、書かれたコードを少し変更した後、私の問題の解決策を得るのに役立ちました。同時に、ユーザーが必要な色と適切なカラーバーで必要なプロットを取得できるように、コードの変更を提案したいと思います。ここにコードがあります、

[X,Y,Z] = peaks(30);

[maxval dummy] = max(Z(:));
[minval dummy] = min(Z(:));

crange=1.5;

% red, yellow, green
cmap = [1 0 0; 1 1 0; 0 1 0];  
colormap(cmap); 

colors = zeros(size(Z));                   
colors(Z <= -crange) = minval-0.1;              % red (1)
colors(Z > -crange & Z < crange) = crange;  % yellow (2)
colors(Z >= crange) = maxval+0.1;              % green (3)

surf(X,Y,Z, colors);
axis([-3 3 -3 3 -10 10]);

cbh = colorbar('YGrid','on');    
caxis([minval-0.1 maxval+0.1]);
set(cbh,'YTick',[minval -crange crange maxval]);

プロット

于 2016-01-29T06:36:30.910 に答える