R 有没有办法用ggplot中的计数统计来注释多个箱线图?

R 有没有办法用ggplot中的计数统计来注释多个箱线图?,r,ggplot2,dplyr,R,Ggplot2,Dplyr,我想使用ggplot2为多列的多个箱线图添加计数统计信息,我尝试使用dplyr中的tally,但计数统计信息不正确。我怎样才能使它正确?有什么好主意吗 可复制数据和我的尝试: library(reshape2) library(dplyr) df1_long <- melt(df, id.vars=c("ID","Tool")) df1_long %>% group_by(Tool, variable)%>% tally %>% ungroup %>% a

我想使用
ggplot2
为多列的多个箱线图添加计数统计信息,我尝试使用dplyr中的
tally
,但计数统计信息不正确。我怎样才能使它正确?有什么好主意吗

可复制数据和我的尝试

library(reshape2)
library(dplyr)

df1_long <- melt(df, id.vars=c("ID","Tool"))
df1_long %>% group_by(Tool, variable)%>%
    tally %>% ungroup %>% as.data.frame() %>%
    setNames(c("tool", "cat_vars", "count")) %>%
    {
        bind_rows(., setNames(., c("tool", "cat_vars", "count")))
    } %>% as.data.frame() %>%
    ggplot(aes(x=tool,y=count,fill=tool))+
    geom_boxplot() + labs(title="CMP") +facet_wrap(~variable)
下面是可复制的数据和我的尝试。基本上,我想在每个子批次中添加计数统计信息,如
tot#uu工具A
tot#uu工具B,tot#u
。我怎样才能在R中做到这一点?有什么快速的方法可以实现这一点吗?谢谢

ID <- c("DJ45","DJ46","DJ47","DJ48","DJ49","DJ53","DJ54","DJ55","DJ56","DJ57")
Tool <- c("Tool_A", "Tool_A", "Tool_A", "Tool_A", "Tool_A", "Tool_B", "Tool_B", "Tool_B", "Tool_B", "Tool_B")
Name <- c("CMP", "CMP", "CMP", "CMP", "CMP", "CMP", "CMP", "CMP", "CMP", "CMP")
MS1 <- c(51,55,50,59,50,47,48,42,43,46)
MS2 <- c(13,11,14,11,10,17,18,17,20,21)
MS3 <- c(2,3,2,5,6,4,9,6,4,4)
MS4 <- c(16,13,14,11,16,16,18,16,19,15)
MS5 <- c(3,6,3,6,3,4,4,8,5,4)
MS6 <- c(7,7,5,5,8,9,8,6,6,9)

df <- data.frame(ID,Tool,Name,MS1,MS2,MS3,MS4,MS5,MS6)
ID我猜tot#u Tool#u A是A的值的总和,tot#u Tool#u B是B的总和,tot#u是总的总和。Tally()不起作用,因为它只计算条目数,这对您来说没有意义,因为每个组合有5个条目数

首先我们可以得到每个子类别的计数和总数。理论上,我们可以将它们放在一个数据框架下,但为了便于注释和解决,让我们将它们分开:

library(tidyr)
library(dplyr)
library(ggplot2)

counts = df %>% 
pivot_longer(MS1:MS6) %>% 
group_by(Tool,name) %>% 
summarize(pos=max(value)+2,value=sum(value))

totalcounts = counts %>% 
group_by(name) %>% 
summarise(pos=max(pos)+5,value=paste("total=",sum(value)))

df %>% pivot_longer(MS1:MS6) %>% 
ggplot(aes(x=Tool,y=value)) + 
geom_boxplot() + facet_wrap(~name) + 
geom_text(data=counts,aes(y=pos,label=value)) +
geom_text(data=totalcounts,aes(x=1.5,y=pos,label=value),col="blue")


在上面的解决方案中,我使用了每个子类别的最大值来指定文本的位置,我把它全部放在中间。你可以在哪里放置它们。

另一个想法,如果我只需要计数,例如,应该是tot#MS1#u Tool#u A=5,tot#MS1#u Tool_B=5,tot#u A#B=10。我试着使用plyr的
count
,这是正确的方法吗?感谢您的帮助我也尝试了
summary(count=n())
,但我的错误是:
error in FUN(X[[I]],…):未找到对象“value”
错误。我还将
summary(pos=max(value)+2,value=count(value))
更改为summary(pos=count(value)+2,value=count(value))`,但我有错误吗?有什么想法吗?谢谢你能试试这个吗?df%%>%pivot_更长(MS1:MS6)%%>%count(工具、名称)。很抱歉,有时很难理解这样的注释,因为您正在将df%%>%pivot_longer(MS1:MS6)%%>%count(工具、名称)的结果传递给ggplot,这是一个计数摘要,其中列值不存在