一つのグループ内のすべてのバーが本質的に1「破損」面としてプロットされているので、表面オブジェクト、各群(各色用すなわち、1種)のための1つを返すbar3
機能。これはthis answerで非常によく説明されているので、ここではこれを繰り返さないでください。
代わりに、私はこの特定の問題の解決策に着きます。表面の関連する特性はCData
である。棒グラフを作成すると、各サーフェスのCData
には、あるサイズのマトリックスが割り当てられます(ここではこれを取得します)。これはすべて同じ値です。各サーフェスごとに異なる値。これは、Figure全体がカラーマップをグループの色に変換する方法です。
各グループはサーフェスで表現されているため、サーフェスの各ポイントで色を定義するためには全体の行列が必要です(linked answerで詳述)。私たちがやりたいまず最初に、この行列のサイズを取得することです:
Z = peaks(5);
bar_h = bar3(Z);
% we take only the first one, but they are all the same size:
cdata_sz = size(bar_h(1).CData)
cdata_sz =
30 4
CData
は常に4列(here理由を参照)を有しており、行数は常にグループの6 *数です。これは、領域オブジェクト(最後の頂点は最初の頂点のようなもの)で1つの閉じた矩形を作成するために5つの頂点を必要とし、1つの線がNaNを持つ棒間の間隔であるため、
次に、元のカラーマップ(Z
と同じサイズ)をCData
に合わせて拡大する必要があります。本質的には、同じバーに属するすべての頂点に対して同じ値を繰り返すだけです。 Z
と仮定すると、当社のカラーデータである(高さにより、すなわち、私たちの色)私たちが行います
z_color = repelem(Z,6,4)
は、今、私たちは私たちのグループの数が異なるセルに私たちのz_color
を分割する必要があります。
z_color = mat2cell(z_color,cdata_sz(1),ones(1,size(Z,2))*cdata_sz(2));
そして最後に、私たちはバープロットに新しい色データを適用します:私たちはすべてを削除したい場合は、
set(bar_h,{'CData'},z_color.')
ボーナスとして、各セルは、一面のオブジェクトのためのカラーリングデータが含まれています私たちのバーからゼロ値は、それはNaNにそれらを設定することで簡単に行うことができます。
Z(abs(Z)<eps) = nan;
C(isnan(Z)) = nan; % if we use a colormap C different from Z
上記のすべて、この便利な機能を煮詰めすることができます使用方法の
function bar_h = Cbar3(Z,C,b,y)
% Z - The data
% C - CData (if other then Z values)
% b - Minimum absolute value to keep colored
% y - y-axis values to order the data by
if nargin<2, C = Z; end
if nargin<3 || isempty(b), b = 0; end
Z(abs(Z)<b) = nan;
C(isnan(Z)) = nan;
if nargin<4
bar_h = bar3(Z);
else
bar_h = bar3(y,Z);
end
cdata_sz = size(bar_h(1).CData);
z_color = repelem(C,6,4);
z_color = mat2cell(z_color,...
cdata_sz(1),ones(1,size(Z,2))*cdata_sz(2));
set(bar_h,{'CData'},z_color.')
end
例:
subplot 121
Z = peaks(30);
Cbar3(Z,Z,0.5);
pbaspect auto
shading flat % just to get a cleaner look
title('Cbar3 using height as color')
subplot 122
Cbar3(Z,rand(size(Z)),0.5);
pbaspect auto
shading flat % just to get a cleaner look
title('Cbar3 using random as color')
結果:
は、私はそれがinterp'' ' ''にFaceColor'を設定する方が簡単だと思う:() 'の図。 hS =サーフ(ピーク(50)、「エッジカラー」、「なし」); hS.FaceColor = 'interp'; '。私の答えの中のリンクをたどって、どのような補間色が 'bar3'のように見えるかを見ることができます。 –
@ Dev-iL確かに、私は関数呼び出しを半分行ったのと、別の関数呼び出しを半分行った理由は全く分かりません。 –