以下是关于如何隐藏零值柱形图的示例。我们先从一个普通的
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)
Z = get(h(i), 'ZData');
rowsInd = reshape(1:size(Z,1), 6,[]);
barsIdx = all([Z(2:6:end,2:3) Z(3:6:end,2:3)]==0, 2);
Z(rowsInd(:,barsIdx),:) = NaN;
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不要绘制由这些点形成的表面。