У меня есть 2-я гистограмма (сюжет 3D - несколько гистограмм, изображенных в виде графика рядом), что я произвел с командой сюжета bar3. Однако все нулевые ценности обнаруживаются как плоские площади в x-y самолете. Есть ли способ, которым я могу препятствовать тому, чтобы MATLAB показал ценности? Я уже попытался заменить все ноли NaNs, но он ничего не изменил о сюжете. Вот кодекс, с которым я экспериментировал:
x1=normrnd(50,15,100,1); %generate random data to test code
x2=normrnd(40,13,100,1);
x3=normrnd(65,12,100,1);
low=min([x1;x2;x3]);
high=max([x1;x2;x3]);
y=linspace(low,high,(high-low)/4); %establish consistent bins for histogram
z1=hist(x1,y);
z2=hist(x2,y);
z3=hist(x3,y);
z=[z1;z2;z3]';
bar3(z)
Как Вы видите, на участке есть довольно много нулевых ценностей. Закрытие числа и перенанесение после замены нолей с NaNs, кажется, ничего не изменяют:
close
z(z==0)=NaN;
bar3(z)
Одним из решений является модификация графических объектов, созданных с помощью bar3
. Сначала необходимо вернуть дескрипторы из bar3
:
h = bar3(z);
В вашем случае h
будет 3-элементный вектор дескрипторов, по одному для каждого набора цветных баров. Следующий код должен сделать невидимыми бины со значениями нуля:
for i = 1:numel(h)
index = logical(kron(z(:, i) == 0, ones(6, 1)));
zData = get(h(i), 'ZData');
zData(index, :) = nan;
set(h(i), 'ZData', zData);
end
И вот иллюстрация (с обязательными кружочками свободного хода):
Если ваш вектор отсчета бинов равен N-by-1
, то bar3
отобразит 6*N
прямоугольные заплаты (т.е. 6 граней кубоида для каждого бина). Свойство 'ZData'
для каждого набора объектов заплаток в h
, таким образом, будет (6*N)-by-4
, так как для каждой прямоугольной грани есть 4 угла. Таким образом, каждый кластер из 6 рядов свойства 'ZData'
является набором координат z для 6 граней одного бина.
В приведённом выше коде сначала создаётся логический вектор с единицами везде, где счётчик бина равен 0, а затем реплицирует каждый элемент этого вектора 6 раз с помощью функции крон
. Это становится индексом для строк свойства 'ZData'
, и этот индекс используется для установки координат z в nan
для патчей пустых бинов. Это приведет к тому, что патчи не будут отрисовываться.
EDIT:
Вот немного измененный вариант кода, который делает его более общим, извлекая высоту бара из свойства 'ZData'
строк , так что для его работы нужны только ручки, возвращаемые из bar3
. Я также обернул код в функцию (без проверки ошибок и ввода):
function remove_empty_bars(hBars)
for iSeries = 1:numel(hBars)
zData = get(hBars(iSeries), 'ZData'); % Get the z data
index = logical(kron(zData(2:6:end, 2) == 0, ones(6, 1))); % Find empty bars
zData(index, :) = nan; % Set the z data for empty bars to nan
set(hBars(iSeries), 'ZData', zData); % Update the graphics objects
end
end