【问题标题】:Plotting two categorical arrays in a histogram/bar chart?在直方图/条形图中绘制两个分类数组?
【发布时间】:2017-07-07 20:28:25
【问题描述】:

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

为了澄清,我的数据集中有 1250 行,每行代表一个人的反应。我将其拆分,因此有一个名为 YESNO 的标称数组,标称 1250x1。它有YN。我还有一个名为RACE 的标称数组,它是 1250x1,并且选择了 5 个不同的种族。

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

如果我不能做到这一点,我至少希望能够有一个表格,显示每场比赛,然后有多少人回答“是”,有多少人回答“否”。

我已尝试执行以下操作:

bar(RACE,YESNO)

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

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

histogram(RACE,YESNO)

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

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

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

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

【问题讨论】:

  • 您能否提供您想要实现的目标的说明以及一些示例数据?我非常怀疑有人会费力生成符合您描述的数据。
  • @Dev-iL,刚刚对其进行了编辑,以便清楚地知道我想要做什么。
  • 嗨@Adriaan,我绝对不是故意要表现出缺乏努力——事实上,我已经用尽了我在文档上的所有资源。我已经包含了我尝试过的内容以及我在最近的编辑中遇到的问题。我是 Matlab 的新手,所以我的技能有限,我正在寻找可以为我指明正确方向的人,因为有多个数据集我想做类似的事情。
  • @Adriaan 谢谢!我还提供了一些关于样本数据的信息以及如何使用这些信息来证明这一点。我没有在网上或 SO 上找到任何允许某人以这种方式绘制分类数据的内容。
  • 我同意 Adriaan - 这个问题现在好多了。您使用的是哪个版本的 MATLAB?

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


【解决方案1】:

假设您的数据如下所示:

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 个。步骤是否完全相同?
  • 我实际上不确定您将如何做到这一点,因为您将总计减去每个类别的“是”的累积得到“否”的数量。
  • 我已经在此处发布了后续问题,以便 SO 社区可以更轻松地为任何未来的搜索者找到它。 stackoverflow.com/questions/42336322/…
  • @rb612 我已经编辑了答案以适应更多类别 2(是/否)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-13
  • 2012-10-23
  • 2012-09-13
  • 2019-02-22
相关资源
最近更新 更多