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))

在此处的示例中,我想绘制具有“高”值的每个年龄组的比例,以及具有“低”值的每个年龄组的比例。更一般地说,我想为类别 2 的每个值绘制属于类别 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文档。

对于如何完成这项工作的任何提示和建议,我将不胜感激。

4

2 回答 2

49

如果这不是您真正想要的,我会理解,但是我发现您对您想要的内容的描述非常混乱,直到我意识到您只是试图以一种对我来说似乎非常不自然的方式来可视化您的数据。

如果有人要求我制作每个类别中的比例图表,我可能会转向分段条形图:

ggplot(df,aes(x = cat2,fill = cat1)) + 
    geom_bar(position = "fill")

在此处输入图像描述

请注意,y 轴根据需要记录比例,而不是计数。

于 2012-06-14T03:49:51.537 回答
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'))

具有两个因素的数据马赛克图

在此图中,每个值对的框根据该类别中的观察数进行缩放。您可以提供颜色矢量以帮助进行可视化。

于 2016-05-27T09:17:58.167 回答