Как скрыться, нулевые ценности в bar3 составляют заговор в MATLAB

У меня есть 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)
10
задан Doresoom 12 January 2010 в 20:09
поделиться

1 ответ

Одним из решений является модификация графических объектов, созданных с помощью 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

И вот иллюстрация (с обязательными кружочками свободного хода):

enter image description here

Как это работает....

Если ваш вектор отсчета бинов равен 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
13
ответ дан 3 December 2019 в 18:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: