如何解决在ggplot中标记每个组中的极值
在geom_violin和geom_point的ggplot组合中,我想标记每个组的极值。但是,这应该严格基于组。 到目前为止,我的解决方案只为我提供了每个组的极值,并在每个组中标记了它们的每个。就像在真实数据中一样,我有10组和3个极端值,这使得该图不可读。
数据
df <- data.frame(group = c('XvsHD','XvsHD','YvsHD','ZvsHD','ZvsHD'),protein = c('A','B','C','D','A','G','F','R'),logFC = c(-1,2,4,5,6,-3,1,2))
extremes <- df %>% group_by(group) %>% slice_max(order_by = logFC,n = 2,preserve = T)%>% pull(protein)
图
df %>%
ggplot(aes(x= group,y = logFC)) +
geom_violin() +
geom_point()
df %>%
ggplot(aes(x= group,y = logFC)) +
geom_violin() +
geom_point() +
geom_label_repel(aes(label= ifelse(protein %in% extremes,as.character(protein),NA),hjust=0,vjust=0))
目标是绘制一个图,其中每个组的两个最极端值都用“蛋白质”标签标记。如果它既适用于极低值又适用于高值/组,那么真的很酷。
非常感谢您!
塞巴斯蒂安
解决方法
您只能创建一个boto3.client
值的label
列,只要每个组中的protein
值是最小值或最大值即可。
logFC
要标记顶部和底部的library(dplyr)
library(ggplot2)
library(ggrepel)
df %>%
group_by(group) %>%
mutate(label = ifelse(logFC %in% range(logFC),protein,'')) %>%
ggplot(aes(x= group,y = logFC,label = label)) +
geom_violin() +
geom_point() +
geom_label_repel(hjust=0,vjust=0)
值,可以使用n
函数。
dense_rank
,
与Ronak Shah的解决方案稍有不同,因为它使用rank
来找到两个最极端的值(定义为与均值之差)。不一定要同时设置一个极端值高和一个低值:两个极端值可以高也可以低。
df <- df %>% group_by(group) %>%
mutate(
logFC_demean = scale(logFC,scale = FALSE),label = ifelse(rank(-abs(logFC_demean),) <= 2,""))
ggplot(df,aes(x= group,vjust=0)