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
条,并使其余的 Other
s.
(例如,对于sampleID == 1
,A
和B
是最常见的两个Type
,E
是剩下的一个,所以所有三个堆栈都会出现在我的最终图中。但是对于 sampleID == 2
、B
和 D
是两个最常见的 Type
,没有 E
,所以 B
和 D
堆栈将出现在我的最终图中,而 A
和 C
将转换为 Other
。或者 sampleID == 4
、B
、E
和 F
堆栈将保留在我的最终图中,而 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()
我正在尝试用我的数据绘制条形图。 我的数据如下所示:
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
条,并使其余的 Other
s.
(例如,对于sampleID == 1
,A
和B
是最常见的两个Type
,E
是剩下的一个,所以所有三个堆栈都会出现在我的最终图中。但是对于 sampleID == 2
、B
和 D
是两个最常见的 Type
,没有 E
,所以 B
和 D
堆栈将出现在我的最终图中,而 A
和 C
将转换为 Other
。或者 sampleID == 4
、B
、E
和 F
堆栈将保留在我的最终图中,而 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()