这是一个示例,显示如何隐藏零值条。我们从一个正常的BAR3图开始:
x = 1:7;
Y = jet(numel(x));
h = bar3(x,Y,'detached');
xlabel x; ylabel y; zlabel z; box on;

请注意,该变量h
包含一个句柄数组surface
(在这种情况下为 3 个,每个“组”条对应一个。这些组对应于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
矩阵(对于XData
、YData
和CData
矩阵也是一样的),其中 N 是每组中矩形条的数量,或者在上面的示例中为 7。
这样,每个矩形都用 6x4 矩阵表示(每个 X/Y/Z 坐标一个)。例如,一个这样的矩形的坐标如下所示:
>> 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
每一列的第二列沿着左面追踪点,第三列沿着右面追踪点,当两者连接时,将绘制矩形的 4 个面:
>> surface(xx(1:6,2:3), yy(1:6,2:3), zz(1:6,2:3), cc(1:6,2:3))
>> view(3)

第一列和最后一列将通过闭合矩形的边来绘制剩余的两个面。
所有这些矩阵都连接为一个高矩阵,并且所有矩形都是使用单个表面对象绘制的。这是通过使用NaN
值来分隔不同部分来实现的,既在同一矩形的点内,也在不同的矩形之间。
因此,上面的代码所做的是寻找 Z 高度为零的矩形,并将其所有值替换NaN
为有效地告诉 MATLAB 不要绘制由这些点形成的表面的值。