С накоплением бар из таблицы в Matlab
Я хочу создать гистограмму из таблицы. Здесь есть MWE типа таблицы, на которую я смотрю:
clear all;
country1=rand(5,1);
country2=rand(5,1);
country3=rand(5,1);
country4=rand(5,1);
country5=rand(5,1);
date=1990:1994;
T=table(date',country1,country2,country3,country4,country5);
T.Properties.VariableNames{1}='date';
T.Total=sum(T{:,2:end},2);
T{:,2:end} = T{:,2:end}./T.Total;
A = table2array(T);
A(:,[1,end])=[];
A=sort(A,2);
TT=array2table(A,'VariableNames',{'country1','country2','country3','country4','country5'});
TT.Date=T.date;
TT.Total=T.Total;
T_new=table(TT.Date, TT.country1,TT.country2,TT.country3,TT.country4,TT.country5,TT.Total);
T_new.Properties.VariableNames=T.Properties.VariableNames;
T_new.World=sum(T{:,2:4},2);
T_new.World=1-(T_new.country4+T_new.country5);
T_new(:,[2:4,end-1])=[];
T_new
date country4 country5 World
____ ________ ________ _______
1990 0.2933 0.29471 0.41199
1991 0.31453 0.34511 0.34035
1992 0.22595 0.29099 0.48307
1993 0.26357 0.33336 0.40306
1994 0.28401 0.28922 0.42677
Тип сложенного бара
====================
На основе T_new
Таблица Я хочу создать гистограмму с накоплением. По оси 'x' на диаграмме должны быть указаны даты (1990,1991 и т. Д.), И для каждой даты должен быть один столбец с накоплением. Так, например, для 1990
там должен быть один столбец, укладывающий значения 0.2933 0.29471 0.41199
В идеале, в строке стека я хочу также включить метки (страна1, страна2, мир) для соответствующих значений.
Как я могу сделать это в Matlab?
2 ответа
Вы можете сделать следующее:
bar(T_new{:,1},T_new{:,2:end},'stacked')
legend(T_new.Properties.VariableNames(2:end))
Код, который вы указали, содержит ошибку в строке:
T{:,2:end} = T{:,2:end}./T.Total
Error using ./
Matrix dimensions must agree.
Error in stacked_bars (line 14)
T{:,2:end} = T{:,2:end}./T.Total;
поскольку T{:,2:end}
это (5 x 6)
матрица и T.Total
это (5 x 1)
массив
Вы можете исправить это, заменив эту строку, например:
T{:,2:end}=bsxfun(@rdivide,T{:,2:end},T.Total)
После исправления ошибки альтернативным способом (относительно уже опубликованного ответа) для нанесения меток может быть использование текстовой функции для рисования строки в каждом из stackedbars
,
Вы можете определить x
а также y
координата точки, в которой нарисовать строку следующим образом:
x
: для каждого набора баровdate
(вам нужно немного сместить это значение влево, чтобы центрировать текст относительно полосы, так какtext
используетx
координата в качестве отправной точкиy
: для первой метки (нижней) может быть просто половина высоты стержня; от второго бара, вам нужно добавить высоту предыдущих
Возможная реализация этого подхода может быть следующей:
% Get the T_new data
x=table2array(T_new)
x=x(:,2:end)
% Ientify the number of bars
n_s_bars=size(x,2)
% Open a Figure for the plot
figure(123)
% Plot the stacked bars
bar(T_new{:,1},T_new{:,2:end},'stacked')
% Get the names of the table variables
v_names=T_new.Properties.VariableNames
% Loop over the dates
for i=1:length(date)
% Create the label string:
% country_x (or world)
% percentage
str=sprintf('%s\n%f',v_names{2},x(i,1))
% Print the label in the center of the first bar
tx=text(date(i)-.3,x(i,1)/2,str,'Color',[1 1 1])
% Loop over the bars, starting from the second bar
for j=2:n_s_bars
% Create the label string:
% country_x (or world)
% percentage
str=sprintf('%s\n%f',v_names{j+1},x(i,j))
% Print the label in the center of the first bar
tx=text(date(i)-.3,sum(x(i,1:j-1))+x(i,j)/2,str)
end
end
Над циклами создается следующее изображение:
Надеюсь это поможет,
Qapla"