【问题标题】:R ggplot2 using ..count.. when using facet_gridR ggplot2 使用 ..count .. 使用 facet_grid 时
【发布时间】:2016-07-25 07:34:13
【问题描述】:

我在 Ubuntu 中使用 R studio,标准更新的 R 和 ggplot2

我尝试在 ggplot 中创建直方图,并按组分隔数据。

我需要绘图的 y 轴来表示被分面网格分割的子组中每个 bin 的频率。

例如,如果我在数据中有两个条目

a group
1 1
2 2

我需要使用 facet_grid 按组拆分,然后显示 a 有一个代表 1 的条形,这是第 1 组中示例的 100%,反之亦然。

我发现这样做的方法是使用 (..count..)/sum(..count) 但是 sum(..count..) 将计算整个数据框中出现的频率,并会给我不想要的结果,

我找不到深入使用 ..count.. 的好文档。

question about special ggplot variables

another question about ..count..

文档中没有什么非常全面的,

这是我正在使用的示例代码

df <- data.frame(a = 1:10, b = 1:10, group = c(rep(1,5),rep(2,5)))
p<-ggplot(df) + geom_histogram(aes(x = a, y = (..count..)/sum(..count..))) +  
   facet_grid(group ~ .)

您可以看到 y 轴将包含 0.1 作为最大值,例如,我希望它显示 1 值的 100% 位于第 1 组中。等等。

编辑:

感谢 Jimbou 的回答和对适用于离散数据的精心构建的漫游的参考,请注意,我在这里遇到的真正问题将需要使用连续数据,以及将多个值分组的 bin,此外,没有关于如何使用 ..count.. 函数执行此操作的适当文档,因此我认为这对于找到解决方案很重要,而不是使用 walk around

【问题讨论】:

  • 你能用吗? ggplot(df, aes(x=a)) + geom_histogram() + facet_grid(group ~ .)
  • 它产生相同的结果,这里的问题是 y 轴上的比例以及 ..count.. 计算数据不同部分的方式。 @Jimbou
  • 当每个变量都在同一个组中时,为什么需要一定比例的组成员。
  • 我不需要群组成员的比例,我需要分配的比例,请注意代码。 @sayaa
  • @captainshai 这不是我的。请看我的回答。

标签: r plot ggplot2


【解决方案1】:

在玩了很多之后,你们都给出了很好的指导, 我发现在 Jimbou 和 Shayaa 的答案之间进行一些添加和融合,以及一些添加的代码,效果很好。

t <- data %>% group_by(group,member,v_rate) %>% tally %>% mutate(f = n/sum(n))

将获取数据并按组、成员、v_rate 分组,并将每个组的计数除以总和(组中的相对频率)

比我们想用ggplot2创建直方图并使用这些值作为直方图的权重函数,否则一切都是徒劳的,

 p <- ggplot(t, aes(x = v_rate, weight = f)) + geom_histogram() + facet_grid(group ~ member)

效果很好。

【讨论】:

    【解决方案2】:

    这是一个 dplyr 解决方案。

    df%>% group_by(group)%>%mutate(n = n(), prop = n/sum(n))
    

    【讨论】:

    • 这看起来很有希望,您能否提供更多详细信息?
    • 好吧,如果你想学习 dplyr,这里有一个很棒的小插图。基本上,%&gt;% 是一个管道运算符,可以解释为“然后”。首先将数据帧按组分组,然后添加一个列,该列计算组内的出现次数,然后计算另一列,该列在组内计数并通过除以总数来计算比例。
    • 请提供更详细的答案,以便我能够接受它作为答案......但在此之前,这对于处理离散变量非常有用,但同样,这对我们使用 ggplot 有什么帮助并为由 facet grid 制作的子组中每个 bin 的相对频率制作一个 y 轴?
    • 好吧,在这种情况下, mutate 可以接受多个参数,这些参数是我将添加到原始矩阵的多个列。第一个计算特定组出现的次数,将其附加到 df 并调用变量 n。然后它计算这个数,将它在整个组中相加,然后将这两个数字相除。它调用这个 value prop,并将其附加到矩阵中。
    • 我们最终需要能够说,例如,数字 1.0 - 2.0 占第 1 组的 30% 等。
    【解决方案3】:

    你可以试试:

    首先使用ave计算每个组的长度:

    df$gr_l <- ave(df$a, df$group, FUN = function(x) length(x))
    

    使用by获取组内每个a的比例:

    df$gr_prop <- c(by(df, df$group + df$a, FUN = function(x) length(x$a)/unique(x$gr_l) ))
    

    绘制数据。

    ggplot(df, aes(x=a, y=gr_prop)) + 
          geom_bar(stat="identity",position='dodge') + 
          facet_grid(group ~ .)
    

    问题类似于thisthat 问题使用ddply 或内部ggplot 解决方案。

    【讨论】:

    • 这个问题不是重复的,你的答案是指离散数据,它不适用于连续数据......我知道我可以绕过这个问题并拆分数据然后sum 和 regroup,但主要思想是了解 ..count.. 的工作方式,因为没有针对此类情况的适当文档,因此这是一个重要的单独问题。
    • 我认为在这种情况下你会使用 ..density.. 。
    • @sayaa 再次,同样的问题,它会检查密度与所有数据,我需要它在被分面网格分隔的组内计算它
    • @jimbou - 另外,当使用连续数据和 bin 时,unique 会扭曲值,如果选择此解决方案,我觉得使用 unique 是有问题的。
    • @captainshai 因为组长度gr_l 仅在df$group 向量上计算,df$group + df$a 的每次交互对于每个组元素都具有相同的值。因此unique 没问题。我会使用.bincode 独立于ggplot 进行分箱。
    【解决方案4】:

    试试..density..?这将使局部质量与局部计数超过当前所写的总体计数

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-24
      • 2019-12-13
      • 2018-11-03
      • 1970-01-01
      • 1970-01-01
      • 2016-09-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多