Вот пример, который показывает, как скрыть бары с нулевыми значениями. Мы начинаем с нормального 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 в пример выше.
Таким образом, каждый прямоугольник представлен матрицами 6х4 (по одной для каждой из координат 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 не рисовать поверхности, образованные этими точками.