【问题标题】:ggplot graphing of proportions of observations within categoriesggplot 绘制类别内观察值的比例
【发布时间】:2012-06-14 02:50:48
【问题描述】:

我正在寻求更好的方法来绘制不同类别​​的观察比例的建议。

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

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 文档。

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

【问题讨论】:

  • 除了我的答案之外,我还将向您指出this 答案可能有用。 (但请注意,随着 ggplot 更新到后续版本,这样的黑客可能无法生存。)
  • 由于这不是典型的数据摘要,因此在 ggplot 内部没有简单的语法可以做到这一点。您最好的方法是预先汇总数据,就像您所做的那样。

标签: r ggplot2


【解决方案1】:

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

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

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

注意 y 轴记录的是比例,而不是计数,如您所愿。

【讨论】:

  • 谢谢,这是一个很好的解决方案。感谢您为我提供了一个很好的替代方案。
  • 谢谢,这是一个非常好的但也非常简单的答案,应该可以帮助很多让自己感到困惑和过于复杂的人(就像我刚才一样)。
  • cat1 必须是因子变量,如果是连续/数字则似乎不起作用
  • @BrianD 在这种情况下,您可能需要geom_colstat = "identity" 变体。
  • @joran 我的意思是在因子是数字的情况下。有时人们将组编码为 1、2 或 0、1,这不被识别为一个因子,应该转换为因子类型以使这种技术起作用。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2015-01-31
    • 2020-02-27
    • 1970-01-01
    • 1970-01-01
    • 2019-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-19
    相关资源
    最近更新 更多