如何在直方图/柱状图中绘制两个分类数组?

3
我有一个分类数组"RACE"和一个是/否数组,我想要创建一个堆积条形图/直方图,每个种族有自己的条,每个条被分成两种不同的颜色–一种颜色用于回答“是”的受访者,另一种颜色用于回答“否”的受访者。在MATLAB中是否有相对简单的方法来完成这项工作?至少是否有一种方法可以创建一个表格,显示每个种族中回答“是”的人数和回答“否”的人数?
为了澄清,我的数据集有1250行,每一行代表一个人的回答。我将其拆分成名义数组"YESNO",它是1250x1的名义数组,具有"Y"或"N"。我还有一个名义数组"RACE",它是1250x1的,并且包含5种不同的种族。
我想做一个看起来像这样的直方图,我是在Tableau中制作的("yes"是橙色,"no"是蓝色):enter image description here 如果我做不到这点,至少我希望能有一张表格来显示每个种族中回答“是”和回答“否”的人数。

我尝试了以下操作:

bar(RACE,YESNO)

我知道XData的值必须是唯一的。

于是我尝试对数据做直方图:

histogram(RACE,YESNO)

然后我得到了类似于这样的东西:

enter image description here

这完全不是我想要的。我已经查看了所有文档,试图找到一种使用这些分类数据绘制堆积条形图或至少堆积直方图的方法,但似乎没有任何东西能够指导我朝着正确的方向前进。我找不到任何有关如何对分类数据进行堆积直方图的信息,而且bar不允许我使用当前的数据来建模。
此外,我愿意使用MATLAB中包含的医院数据集来查看示例。有性别列可以以类似的方式绘制与吸烟有关的图表。
在MATLAB中有没有解决这个问题的方法?

您能提供一下您想要实现的内容和一些样例数据吗?我很怀疑有人会费力地生成符合您描述的数据。 - Dev-iL
@Dev-iL,刚刚编辑了一下,以便清楚我想做什么。 - rb612
嗨@Adriaan,我绝对不是想表现出缺乏努力 - 实际上,我已经在文档中耗尽了所有资源。我在最近的编辑中包含了我尝试过的内容以及我卡住的地方。我是Matlab的新手,我的技能有限,我正在寻找有人指引我正确的方向,因为我有多个数据集需要做类似于这样的事情。 - rb612
@Adriaan 谢谢!我还包括了一些有关示例数据和如何使用它来演示的信息。我在网上或 SO 上没有找到任何可以让人以这种方式绘制分类数据的东西。 - rb612
我同意Adriaan的看法 - 这个问题现在好多了。你使用的是哪个版本的MATLAB? - Dev-iL
@Dev-iL,谢谢。我正在使用2016b版的Mac,更新于2016年9月7日。 - rb612
1个回答

3
假设你的数据长这样:
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  

非常感谢!这正是我想要的。我的唯一问题是,是否可以将其推广到具有超过是/否的更多选项,并且在该类别中有超过2个选项。步骤是否完全相同? - rb612
我其实不确定该怎么做,因为你需要将总数减去每个类别的“是”累积量,才能得到“否”的数量。 - rb612
我已经在这里发布了后续问题,以便于任何未来的搜索者更容易地找到它。http://stackoverflow.com/questions/42336322/matlab-working-with-accumarray-with-multiple-categories - rb612
@rb612 我已经编辑了答案,以适应更多的类别,包括 2 (是/否)。 - EBH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接