我有一个分类数组,种族和一个是/否数组,我想以某种方式创建一个堆积条/直方图,每个种族都有自己的条,每个条被分成两种不同的颜色 - 一种对于那些说“是”的受访者,对于那些说“不”的受访者。有没有办法在MATLAB中相对简单地做到这一点?有没有办法至少创建一个表格,显示每个种族,有多少人说是,有多少人说没有?
为了澄清,我的数据集中有1250行,每行代表一个人的回答。我把它拆开,所以有一个名为YESNO
的标称数组,标称值为1250x1。它有Y
或N
。我还有一个名为RACE
的名义数组,它是1250x1,并且选择了5种不同的种族。
我想以某种方式制作一个看起来像这样的直方图,我在Tableau中制作(“是”是橙色,蓝色是“否”):
如果我不能这样做,我至少希望能够有一个表格显示每个种族,然后有多少人回答“是”和多少回答“否”。
我尝试过以下操作:
bar(RACE,YESNO)
我知道XData值必须是唯一的。
然后我尝试对数据进行直方图:
histogram(RACE,YESNO)
我得到的东西看起来像这样:
这根本不是我想要的。我一直在查看文档,看看是否有办法用这个分类数据做一个堆积条形图,或者至少是一个堆积直方图,但似乎没有什么能够指出我正确的方向。我在查找分类数据的堆叠直方图时找不到任何内容,bar
不允许我使用我当前的数据进行建模。
另外,我愿意使用MATLAB中包含的hospital data set来查看示例。可以以类似的方式绘制针对吸烟的性别列。
在MATLAB中有没有办法解决这个问题?
答案 0 :(得分:2)
假设您的数据如下:
yesno = categorical(randi(2,1250,1),[1 2],{'no','yes'});
race = categorical(randi(5,1250,1),1:5,{'Asian','Black','BHispanic','White','WHispanic'});
您可以执行以下操作:
% convert everything to numeric:
yn = double(yesno);
rac = double(race);
% caluculate all frequencies:
data = accumarray([rac yn],1);
% get the categories names:
races = categories(race);
answers = categories(yesno);
% plotting:
bar(data,0.4,'stacked');
ax = gca;
ax.XTickLabel = races; % set the x-axis ticks to the race names
legend(answers) % add a legend for the colors
colormap(lines(3)) % use nicer colors (close to your example)
ylabel('YES/NO')% set the y-axis lable
% some other minor fixes:
box off
ax.YGrid = 'on';
结果:
你可以用它制作一张桌子:
T = array2table(data.','VariableNames',races,'RowNames',answers)
输出:
T =
Asian Black BHispanic White WHispanic
_____ _____ _________ _____ _________
no 126 123 102 128 144
yes 145 126 128 105 123