在直方图/条形图中绘制两个分类数组?

时间:2017-02-18 08:04:46

标签: matlab plot bar-chart matlab-figure categorical-data

我有一个分类数组,种族和一个是/否数组,我想以某种方式创建一个堆积条/直方图,每个种族都有自己的条,每个条被分成两种不同的颜色 - 一种对于那些说“是”的受访者,对于那些说“不”的受访者。有没有办法在MATLAB中相对简单地做到这一点?有没有办法至少创建一个表格,显示每个种族,有多少人说是,有多少人说没有?

为了澄清,我的数据集中有1250行,每行代表一个人的回答。我把它拆开,所以有一个名为YESNO的标称数组,标称值为1250x1。它有YN。我还有一个名为RACE的名义数组,它是1250x1,并且选择了5种不同的种族。

我想以某种方式制作一个看起来像这样的直方图,我在Tableau中制作(“是”是橙色,蓝色是“否”): enter image description here

如果我不能这样做,我至少希望能够有一个表格显示每个种族,然后有多少人回答“是”和多少回答“否”。

我尝试过以下操作:

bar(RACE,YESNO)

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

然后我尝试对数据进行直方图:

histogram(RACE,YESNO)

我得到的东西看起来像这样:

enter image description here

这根本不是我想要的。我一直在查看文档,看看是否有办法用这个分类数据做一个堆积条形图,或者至少是一个堆积直方图,但似乎没有什么能够指出我正确的方向。我在查找分类数据的堆叠直方图时找不到任何内容,bar不允许我使用我当前的数据进行建模。

另外,我愿意使用MATLAB中包含的hospital data set来查看示例。可以以类似的方式绘制针对吸烟的性别列。

在MATLAB中有没有办法解决这个问题?

1 个答案:

答案 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';

结果:

the bar

你可以用它制作一张桌子:

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