在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

enter image description here


要标记顶部和底部的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)