geom_bar 只显示感兴趣的特定堆栈

geom_bar only show specific stacks of interest

我正在尝试用我的数据绘制条形图。 我的数据如下所示:

df <- data.frame("sampleID" = c(1,1,1,2,2,2,2,3,3,3,3,4,4,4,4), 
                 "Type" = c("A","B","E","A","B","C","D","A","C","D","F","B","C","E","F"), 
                 "Frequency" = c(10,2,1,5,7,1,6,8,4,3,1,6,5,2,6))

我用以下方法绘制了这个:

ggplot(data=df, aes(x=sampleID, y=Frequency, fill=Type)) +
   geom_bar(stat="identity")

这给了我这个情节:

现在我想弄清楚如何在每个sample ID 条,并使其余的 Others.

(例如,对于sampleID == 1AB是最常见的两个TypeE是剩下的一个,所以所有三个堆栈都会出现在我的最终图中。但是对于 sampleID == 2BD 是两个最常见的 Type,没有 E,所以 BD 堆栈将出现在我的最终图中,而 AC 将转换为 Other。或者 sampleID == 4BEF 堆栈将保留在我的最终图中,而 C 将转换为 Other。)

我找到了其他使用 slice 来保持最高频率的示例,但我不知道如何将其应用于每个 sampleID,而不是整个 df,我找不到任何明确强制 geom_bar 显示特定堆栈的示例。任何人都可以提供任何建议吗?

如果你定义这个小辅助函数:

top2_or_e <- function(x) {
   x$Type[-unique(c(order(-x$Frequency)[1:2], which(x$Type == "E")))] <- "other"
   x
}

那么你可以这样做:

library(ggplot2)
library(RColorBrewer)

ggplot(data = do.call(rbind, lapply(split(df, df$sampleID), top2_or_e)),
       aes(x = sampleID, y = Frequency, fill = Type)) +
   geom_col(color = "gray50") +
  scale_fill_manual(values = c(brewer.pal(6, "Pastel1"), "gray50")) +
  theme_bw()