С накоплением бар из таблицы в 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"

Другие вопросы по тегам