geom_signif() 函数即可加上,具体参数

geom_signif(
    y_position = c(38),
    comparisons = list(c("非生长季", "生长季")), #设定哪些数据之间进行显著性检验
    step_increase = 0.1, #暂时不懂
    map_signif_level = F, #是否用***表示
    test = t.test, #检验方法,这里为T检验
    textsize=6, #文本大小
    vjust=2, #文本位置,hjust调左右
    annotations = c("p<0.001"), #修改标记,和前面的comparisons参数对应
    family= "ST_TNR",
    tip_length = rep(0.02,8) #修改短线
  )

下面为一个例子

ggplot(mpg, aes(class, hwy)) +
  geom_boxplot() +
  geom_signif(
    annotations = c("First", "Second"),
    y_position = c(30, 40), 
    xmin = c(1, 6), 
    xmax = c(6, 3)
  )

下面也是一个例子

library(ggplot2)
library(tidyverse)
library(ggsignif)

# 数据构建:
# 基础数据矩阵:
data <- data.frame(
  r1 = c(runif(10, min=10, max=40), runif(3, min=0, max=10), runif(3, min=50, max=80)),
  r2 = c(runif(10, min=5, max=30), runif(3, min=0, max=5), runif(3, min=30, max=40)),
  r3 = c(runif(10, min=6, max=30), runif(3, min=0, max=6), runif(3, min=30, max=50)),
  r4 = c(runif(10, min=10, max=40), runif(3, min=0, max=10), runif(3, min=50, max=80)),
  r5 = c(runif(10, min=5, max=30), runif(3, min=0, max=5), runif(3, min=30, max=40)),
  r6 = c(runif(10, min=6, max=30), runif(3, min=0, max=6), runif(3, min=30, max=50)),
  r7 = c(runif(10, min=10, max=100), runif(3, min=0, max=10), runif(3, min=100, max=250)),
  r8 = c(runif(10, min=10, max=40), runif(3, min=0, max=10), runif(3, min=50, max=80)),
  r9 = c(runif(10, min=10, max=40), runif(3, min=0, max=10), runif(3, min=50, max=80)),
  r10 = c(runif(10, min=20, max=150), runif(3, min=0, max=20), runif(3, min=150, max=200)),
  r11 = c(runif(10, min=10, max=50), runif(3, min=0, max=10), runif(3, min=50, max=80)),
  r12 = c(runif(10, min=10, max=40), runif(3, min=0, max=10), runif(3, min=50, max=80))
)

# 宽数据转长数据:
data_long <- data %>%
  pivot_longer(cols = everything(),
               names_to = "group",
               values_to = "values")

data_long$group2 <- factor(rep(rep(c("9p21-WT", "9p21-LOH","9p21-Loss"), 4),16),
                          levels = c("9p21-WT", "9p21-LOH","9p21-Loss"))
data_long$cancer <- rep(rep(c("HNSC_HPV", "PAAD_ALL","SKCM_ALL", "SKCM_BRAF"), rep(3, 4)),16)

data_long$group <- factor(data_long$group, levels = paste0("r",1:12))

# 中位数线数据:
x_value <- c(0.7, 1.3)
for (i in 1:11) {
  x_value <- append(x_value, x_value[((i-1)*2+1):(i*2)]+1)
}

med_value <- rep(apply(data, 2, median), rep(2,12))
tmp_data <- data.frame(
  x_value = x_value,
  med_value = med_value,
  group = rep(colnames(data), rep(2,12))
)

# 绘图:
ggplot(data_long)+
  geom_boxplot(aes(group, values, fill = group2, color = group2),
               # 间距调整:
               width = 0.5,
               outlier.shape = NA
               )+
  # 中位数线:
  geom_line(data = tmp_data, aes(x_value, med_value, group = group), color = "#ffffff")+
  # 顶部灰色方块:
  geom_rect(aes(xmin=0, xmax=13, ymin=220, ymax = 240), fill="#eaeae0")+
  # 灰色竖线:
  geom_vline(xintercept = c(3.5, 6.5, 9.5), color = "#bcbdbf", alpha = 0.8)+
  # x轴标签:
  scale_x_discrete(labels = rep(c("9p21-WT", "9p21-LOH","9p21-Loss"), 4))+
  scale_y_continuous(expand = c(0,0))+
  # 颜色:
  scale_fill_manual(values = c("#bcbdbf", "#86c4e7", "#3675b6"))+
  scale_color_manual(values = c("#bcbdbf", "#86c4e7", "#3675b6"))+
  # 主题:
  theme_bw()+
  theme(panel.grid = element_blank(),
        legend.position = "none",
        plot.title = element_text(hjust = 0.5),
        axis.title = element_blank(),
        axis.text.x = element_text(angle = 30, vjust = 1, hjust = 1))+
  # 标题:
  ggtitle("TCR Richness")+
  # 添加p值:
  geom_signif(aes(group, values),
              comparisons = list(c("r1", "r2"),
                             c("r4", "r5"),
                             c("r7", "r9"),
                             c("r10", "r11")),
              vjust = 2,
              tip_length = rep(0,8),
              y_position = c(100, 110, 180, 200),
              # 修改注释内容
              annotations = c("q = 1.5e-5", "q = 2.2e-4",
                              "q = 1.5e-4", "q = 0.008"))+
  annotate("text", x = seq(2,11, 3), y = 230, label = unique(data_long$cancer))

ggsave("boxplot.pdf", height = 4, width = 8)