我想从表格创建堆积条形图。这里有一个我正在研究的表格类型的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
Stacked BAR的类型
====================
基于T_new
表,我想创建一个堆积条形图。在'x'轴上,图表应显示日期(1990,1991等),每个日期应为一个堆积条。因此,例如,对于1990
,应该有一个条形图堆叠值0.2933 0.29471 0.41199
理想,在堆栈栏中我还想包含相应值的(country1,country2,world)标签。
我如何在matlab中做到这一点?
答案 0 :(得分:1)
答案 1 :(得分:0)
您提供的代码包含一行错误:
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)
修复错误后,绘制标签的另一种方法(相对于已发布的答案)可以使用text function在每个stackedbars
中绘制一个字符串。
您可以通过这种方式识别绘制字符串的点的x
和y
坐标:
x
:对于每组条形图,都是相应的date
(您需要在左侧稍微移动该值,以使文本相对于条形图居中,因为{{1}使用text
坐标作为起点x
:因为第一个标签(下面)可能只是酒吧高度的一半;从第二个栏开始,你需要添加前一个栏的高度这种方法的可能实现如下:
y
在循环中,生成以下图像:
希望这有帮助,
Qapla'