Ошибка в построении значений по времени: ошибка при использовании бара: значения y должны быть числами c или массивами длительностей - PullRequest
1 голос
/ 11 апреля 2020

Обновление

Эта проблема теперь добавлена ​​в список задач, связанных с премией тысячелетия

данные:

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 

Результат

Result

Как я хочу

Want

1 Ответ

0 голосов
/ 12 апреля 2020

сообщение об ошибке ясно - ваш массив Y не является цифрой c, поэтому он не может построить график. Если вы установите точку останова в этой строке, вы увидите, что Y - это массив объекта datetime.

Чтобы преобразовать его в массив цифр c, есть несколько способов, одним из которых является вызов функции posixtime (). вот так

unixtime=(arrayfun(@(x) posixtime(x), stackData));
Y = squeeze(unixtime(:,i,:));
h(i,:) = barh(Y, 'stacked');

теперь вы можете построить график стекового бара.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...