使用facet_grid时使用..count的R ggplot2

时间:2016-07-25 07:34:13

标签: r plot ggplot2

我在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的答案和对适合离散数据的精心构建的漫游的参考,请注意我在这里遇到的真正问题需要使用连续数据,以及分组多个值的箱子,此外,没有关于如何使用..count ..函数执行此操作的正确文档,因此我认为找到解决方案并且不使用遍历

非常重要

4 个答案:

答案 0 :(得分:2)

这是一个dplyr解决方案。

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

答案 1 :(得分:2)

经过大量的游戏,你们都给出了非常好的指示, 我发现Jimbou和Shayaa的答案之间有一点点补充和融合,还有一些补充的代码可以很好地运作。

function parseArabic(str) {
        return Number( str.replace(/[٠١٢٣٤٥٦٧٨٩]/g, function(d) {
            return d.charCodeAt(0) - 1632;
        }).replace(/[۰۱۲۳۴۵۶۷۸۹]/g, function(d) {
            return d.charCodeAt(0) - 1776;
        }) );
    }

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

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

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

效果很好。

答案 2 :(得分:1)

您可以尝试:

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

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

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

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解决方案提问。

答案 3 :(得分:0)

尝试..density..吗?这样将得出当前编写的所有总计数中的局部质量与局部计数之比