ggplot 绘制类别内观测比例的图表

13
我希望您能给出关于更好的绘制不同类别观测比例的建议。我有一个数据框,看起来像这样:
cat1 <- c("high", "low", "high", "high", "high", "low", "low", "low", "high", "low", "low")
cat2 <- c("1-young", "3-old", "2-middle-aged", "3-old", "2-middle-aged", "2-middle-aged", "1-young", "1-young", "3-old", "3-old", "1-young")
df <- as.data.frame(cbind(cat1, cat2))

在这个例子中,我想绘制每个年龄组“高”值的比例和每个年龄组“低”值的比例。更一般地,我想要绘制针对category 2每个取值的情况下,落入category 1每个级别中的观测百分比。以下代码可以生成正确的结果,但需要在绘图前手动计数和除法运算。是否有一种好的方法可以在ggplot内部自动完成?
library(plyr)
count1 <- count(df, vars=c("cat1", "cat2"))
count2 <- count(df, "cat2")

count1$totals <- count2$freq
count1$pct <- count1$freq / count1$totals

ggplot(data = count1, aes(x=cat2, y=pct))+
facet_wrap(~cat1)+
geom_bar()

这个之前的stackoverflow问题提供了类似的东西,以下是代码:

ggplot(mydataf, aes(x = foo)) + 
geom_bar(aes(y = (..count..)/sum(..count..)))

但是我不想要“sum(..count..)”作为分母 - 它会给出所有箱子的计数总和 - 而是想要每个“cat2”类别的计数总和。我也研究了stat_bin文档。
如果您能提供任何有关如何使其工作的提示和建议,我将不胜感激。

1
除了我的回答,我还会指向这个可能有用的答案。(但要注意,像那样的hack可能无法在ggplot更新到后续版本时生存。) - joran
由于这不是数据的典型摘要,因此在ggplot内部没有简单的语法来执行它。您最好的方法是预先对数据进行汇总,就像您所做的那样。 - Brian Diggs
2个回答

51
我会理解如果这不是你真正想要的,但在我意识到你只是试图以一种对我来说非常不自然的方式将数据可视化之前,我对你所需内容的描述感到非常困惑。
如果有人让我制作一个显示每个类别比例的图表,我可能会采用分段条形图:
ggplot(df,aes(x = cat2,fill = cat1)) + 
    geom_bar(position = "fill")

enter image description here

请注意,y轴记录的是比例而不是数量,正如您所希望的。

谢谢,这是一个很棒的解决方案。感谢您为我提供了一个很好的替代方案,以取代我之前尝试做的事情。 - user1257313
1
谢谢,这是一个非常好但也非常简单的答案,应该能帮助很多人解决自己混淆和过度复杂化的问题(就像我刚才一样)。 - James Lupolt
cat1 必须是一个因子变量,如果是连续/数值型的则似乎无法工作。 - Brian D
@BrianD 在这种情况下,你可能想要使用 geom_colstat = "identity" 变体。 - joran
@joran 我的意思是在因素为数字的情况下。有时人们将组编码为1、2或0、1,这不被识别为因子,应将其转换为因子类型以使该技术起作用。 - Brian D

8
这可能对您来说有点晚,并且与ggplot无关,但是:
我认为马赛克图是可视化两个因素交互的前进方向:
cat1 <- c("high", "low", "high", "high", "high", "low", "low", "low", "high", "low", "low")
cat2 <- c("1-young", "3-old", "2-middle-aged", "3-old", "2-middle-aged", "2-middle-aged", "1-young", "1-young", "3-old", "3-old", "1-young")
df <- as.data.frame(cbind(cat1, cat2))

mosaicplot(cat2 ~ cat1, data = df, col = c(lightskyblue2', 'tomato'))

两因素数据的镶嵌图

在这个图中,每个数值对应的方框根据该类别中的观测次数进行缩放。您可以提供一个颜色向量来辅助可视化。


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