ggplot图表显示类别内观察的比例

时间:2012-06-14 02:50:48

标签: r ggplot2

我正在寻找有关更好地绘制不同类别​​观察比例的建议。

我的数据框看起来像这样:

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

This previous stackoverflow question提供类似的功能,代码如下:

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

但是我不想要“sum(.. count ..)” - 它在分母中给出了所有分类的总数 - 总和;相反,我想要每个“cat2”类别的计数总和。我还研究了stat_bin文档。

如果有任何关于如何使这项工作的提示和建议,我将不胜感激。

2 个答案:

答案 0 :(得分:38)

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

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

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

enter image description here

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

答案 1 :(得分:6)

对你来说这可能有点晚了,它不涉及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'))

mosaic plot of data with two factors

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