首页 > 解决方案 > 如何绘制一个堆叠的条形图,其中三个分类变量表示 r 中每个方面仅其中一个的比例?

问题描述

这是作为参考的数据

df <- data.frame(a = c(3,3,3,3,3,2,2,3,2,1,1,1,3,1,3), b = c(1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2), c = c(4, 5, 3, 2, 4, 2, 3, 4, 5, 4, 4, 3, 3, 1, 2) )

我想为每个方面绘制一个具有 a 比例的条形图。同时我希望根据 b 值对条进行着色。变量 b 与计算百分比无关。这就是我想出来的,当我设置fill = c时,它将堆叠的颜色一分为二,一个对应1,另一个对应NA。

      ggplot(aes(x = a, y = ...prop..., group = 1, fill = b)) +
          geom_bar(position = "stack") +
          facet_wrap(~c, nrow = 1, ncol = 5) +
          labs(title = "Count of a among c")

在此处输入图像描述

我怎样才能得到与这个相似的结果,但每个面换行的比例而不是绝对值?

谢谢!

在此处输入图像描述

标签: rggplot2stackbar-chartprop

解决方案


这是一种使用..count....PANEL..特殊符号的方法:

ggplot(df, aes(x = a, fill = as.factor(b))) +
  geom_bar(aes(y = ..count.. / tapply(..count..,..PANEL..,sum)[..PANEL..])) +
  facet_wrap(~c, nrow = 1, ncol = 5) +
  labs(title = "Count of a among c", fill = "b", y = "Proportion")  

在此处输入图像描述 如果你不使用facet_wrap这将是微不足道的设置y = ..prop... 但是,..prop..不能按刻面正确计算。因此,为了解决这个问题,我们可以使用tapply..PANEL..特殊符号 tosum ..count..仅用于该面板。最后[..PANEL..]是对结果向量进行子集化。

您遇到的另一个问题b是数字类,因此您需要将其转换为因子。


推荐阅读