Обновление
Эта проблема теперь добавлена в список задач, связанных с премией тысячелетия
данные:
https://drive.google.com/open?id=1hAisMg233kfEqBSM4htdt77dRl37ce6s
Сценарий
excelTable = readtable('excelfile.xlsx');
T = table2array(excelTable(1:end,3:end));
% S
a1 = T(18,3:end);
b1 = T(17,3:end);
c1 = T(16,3:end);
d1 = T(15,3:end);
e1 = T(14,3:end);
% H
a2 = T(12,3:end);
b2 = T(11,3:end);
c2 = T(10,3:end);
d2 = T(9,3:end);
e2 = T(8,3:end);
% HS
a3 = T(5,3:end);
b3 = T(4,3:end);
c3 = T(3,3:end);
d3 = T(2,3:end);
e3 = T(1,3:end);
% T
t = [1 2 3 4 5];
% Plotted
dates = [cat(3,e1,e2,e3); cat(3,d1,d2,d3); cat(3,c1,c2,c3); cat(3,b1,b2,b3); cat(3,a1,a2,a3)];
plotBarStackGroups(dates,t)
title('excel file')
xlabel('Time')
ylabel('Tail')
legend({'S', 'U/S', 'H','HS'})
legend('Location', 'southoutside')
legend('Orientation','horizontal')
plotBarStackGroups
function [] = plotBarStackGroups(stackData, groupLabels)
NumGroupsPerAxis = size(stackData, 1);
NumStacksPerGroup = size(stackData, 2);
% Count off the number of bins
groupBins = 1:NumGroupsPerAxis;
MaxGroupWidth = 0.65; % Fraction of 1. If 1, then we have all bars in groups touching
groupOffset = MaxGroupWidth/NumStacksPerGroup;
figure
hold on;
for i=1:NumStacksPerGroup
Y = squeeze(stackData(:,i,:));
% Center the bars:
internalPosCount = i - ((NumStacksPerGroup+1) / 2);
% Offset the group draw positions:
groupDrawPos = (internalPosCount)* groupOffset + groupBins;
h(i,:) = barh(Y, 'stacked');
set(h(i,:),'BarWidth',groupOffset);
set(h(i,:),'XData',groupDrawPos);
end
hold off;
set(gca,'YTickMode','manual');
set(gca,'YTick',1:NumGroupsPerAxis);
set(gca,'YTickLabelMode','manual');
set(gca,'YTickLabel',groupLabels);
end
ОШИБКА
Ошибка при использовании бара (строка 175). Значения y должны быть цифрами c или массивами длительности.
Ошибка в LS (строка 31) plotBarStackGroups (даты, t)
ВЫПУСК
Я хочу, чтобы результат был нанесен на график в зависимости от времени. Значения в массивах должны меняться со временем. Я не могу преобразовать их в числовое значение c, потому что они должны быть ВЕ.
Ответ на Sol 1
Измененный код:
function [] = plotBarStackGroups(stackData, groupLabels)
NumGroupsPerAxis = size(stackData, 1);
NumStacksPerGroup = size(stackData, 2);
% Count off the number of bins
groupBins = 1:NumGroupsPerAxis;
MaxGroupWidth = 0.65; % Fraction of 1. If 1, then we have all bars in groups touching
groupOffset = MaxGroupWidth/NumStacksPerGroup;
figure
hold on;
for i=1:NumStacksPerGroup
unixtime=(arrayfun(@(x) posixtime(x), stackData));
Y = squeeze(unixtime(:,i,:));
% Center the bars:
internalPosCount = i - ((NumStacksPerGroup+1) / 2);
% Offset the group draw positions:
groupDrawPos = (internalPosCount)* groupOffset + groupBins;
h(i,:) = barh(Y, 'stacked');
set(h(i,:),'BarWidth',groupOffset);
set(h(i,:),'XData',groupDrawPos);
end
hold
off;
set(gca,'YTickMode','manual');
set(gca,'YTick',1:NumGroupsPerAxis);
set(gca,'YTickLabelMode','manual');
set(gca,'YTickLabel',groupLabels);
end
Результат
Как я хочу