2017-02-11 78 views
1

我想從表格創建堆積條形圖。在這裏有我的表的類型的MWE正在看:從matlab中的表中堆積的酒吧

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

理想,在棧欄我想也包括(COUNTRY1,COUNTRY2,世界)爲correspending值的標籤。

我如何在matlab中做到這一點?

回答

1

你可以做到以下幾點:

bar(T_new{:,1},T_new{:,2:end},'stacked') 
legend(T_new.Properties.VariableNames(2:end)) 

stacked bar

0

您所提供的代碼包含在線上的erron:

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是a (5 x 1) array

您可以修復它替換該行有,例如:

T{:,2:end}=bsxfun(@rdivide,T{:,2:end},T.Total) 

一旦固定的錯誤,另一種方式(相對於已經發布的答案)來繪製標籤可以使用text function繪製字符串在每個stackedbars

您可以標識要在其中繪製的字符串這樣的點xy座標:

  • 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 

在環路,產生如下圖:

enter image description here

希望這有助於,

Qapla'

+0

如果你有Matlab 2016b,這個'T {:,2:end} ./ T.Total',不是一個錯誤。 – EBH

+0

而且,我看到你真的喜歡動畫GIF :) – EBH

相關問題