値がゼロのバーを非表示にする方法を示す例を次に示します。通常のBAR3プロットから始めます。
x = 1:7;
Y = jet(numel(x));
h = bar3(x,Y,'detached');
xlabel x; ylabel y; zlabel z; box on;

変数h
にはハンドルの配列が含まれていることに注意してくださいsurface
(この場合は 3 つ、バーの「グループ」ごとに 1 つ。グループはY
マトリックスの列に対応し、それぞれが異なる色で表されます)。
そして今、ゼロ値を非表示にするコード:
for i=1:numel(h)
%# get the ZData matrix of the current group
Z = get(h(i), 'ZData');
%# row-indices of Z matrix. Columns correspond to each rectangular bar
rowsInd = reshape(1:size(Z,1), 6,[]);
%# find bars with zero height
barsIdx = all([Z(2:6:end,2:3) Z(3:6:end,2:3)]==0, 2);
%# replace their values with NaN for those bars
Z(rowsInd(:,barsIdx),:) = NaN;
%# update the ZData
set(h(i), 'ZData',Z)
end

説明:
バーのグループごとに、surface
グラフィック オブジェクトが作成されます (ハンドルは に格納されh(i)
ます)。その Z 座標マトリックスZData
は、マトリックス ( 、、およびマトリックス6*N-by-4
と同じもの) として表されます。ここで、N は各グループ内の長方形のバーの数、または上記の例では 7 です。XData
YData
CData
このように、各長方形は 6x4 の行列 (X/Y/Z 座標ごとに 1 つ) で表されます。たとえば、そのような長方形の座標は次のようになります。
>> xx = get(h(3),'XData'); yy = get(h(3),'YData'); zz = get(h(3),'ZData');
>> xx(1:6,:)
ans =
NaN 2.6 3.4 NaN
2.6 2.6 3.4 3.4
2.6 2.6 3.4 3.4
NaN 2.6 3.4 NaN
NaN 2.6 3.4 NaN
NaN NaN NaN NaN
>> yy(1:6,:)
ans =
NaN 0.6 0.6 NaN
0.6 0.6 0.6 0.6
1.4 1.4 1.4 1.4
NaN 1.4 1.4 NaN
NaN 0.6 0.6 NaN
NaN NaN NaN NaN
>> zz(1:6,:)
ans =
NaN 0 0 NaN
0 1 1 0
0 1 1 0
NaN 0 0 NaN
NaN 0 0 NaN
NaN NaN NaN NaN
それぞれの 2 列目は左面に沿って点をトレースし、3 列目は右面に沿って点をトレースします。2 つを接続すると、長方形の 4 つの面が描画されます。
>> surface(xx(1:6,2:3), yy(1:6,2:3), zz(1:6,2:3), cc(1:6,2:3))
>> view(3)

最初と最後の列は、長方形の辺を閉じることによって残りの 2 つの面を描画します。
このような行列はすべて 1 つの背の高い行列として連結され、四角形はすべて 1 つのサーフェス オブジェクトを使用して描画されます。これは、NaN
値を使用して、同じ四角形のポイント内と異なる四角形の間の両方で、異なる部分を分離することによって実現されます。
したがって、上記のコードが行うことは、Z 高さがゼロの四角形を探し、そのすべての値をNaN
MATLAB にそれらの点によって形成される面を描画しないように効果的に指示する値で置き換えることです。