这是一个示例,说明如何隐藏零值条形图。我们从一个普通的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 不要绘制由这些点形成的曲面。