You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在ggplot2中调整stat_pvalue_manual生成的两两比较括号顺序

解决方案

你猜的完全正确!stat_pvalue_manual()是严格按照pwc数据框的行顺序来绘制比较括号的——行在前的比较会先被绘制,对应的y.position也会按顺序分配。所以只要重新排序pwc的行,再匹配好y.position的顺序,就能轻松调整括号布局。具体操作分三步:

1. 先确认当前的比较顺序

先运行print(pwc)查看输出,重点看group1group2或者comparison列(如果有的话),搞清楚现在的比较组合对应的行位置,以及你想要调整的顺序对应的行。

2. 重新排序pwc数据框

这里有两种常用方法,按需选择:

方法一:按指定的比较组合排序(推荐)

如果知道自己想要的比较顺序,直接定义一个顺序列表,把pwc里的comparison列转成因子并指定顺序,再排序:

library(dplyr)

# 定义你想要的比较顺序,要和pwc里comparison列的格式完全一致
desired_comparisons <- c(
  "init_com_rank vs battery_rank",
  "init_com_rank vs com_interrupted_rank",
  # 继续添加剩下的比较组合,按你想要的顺序排列
  "xxx vs yyy",
  "aaa vs bbb"
)

# 重新排序pwc
pwc_ordered <- pwc %>%
  mutate(comparison = factor(comparison, levels = desired_comparisons)) %>%
  arrange(comparison)

如果你的pwc没有comparison列,可以先手动生成:

pwc <- pwc %>% mutate(comparison = paste(group1, "vs", group2))

方法二:按行索引手动提取

如果你已经知道想要保留的行的索引,直接用slice()提取即可:

# 比如你想要第3行、第1行、第4行、第2行的顺序,就这么写
pwc_ordered <- pwc %>% slice(c(3, 1, 4, 2))

3. 用排序后的pwc绘图

把原来代码里的pwc换成pwc_ordered,同时调整y.position的顺序,确保和pwc_ordered的行顺序一一对应——比如你想要第一个比较(init_com_rank vs battery_rank)对应y=5.5,第二个对应y=5.75,就把y.position的数值按这个顺序排列:

ggplot(df, aes(x = reorder(variable, -value), y = value)) + 
  stat_summary(fun = mean, geom = "bar", fill = "#9E0142", width = 0.75) + 
  stat_summary(fun.data = mean_cl_boot, geom = "errorbar", colour="black", position=position_dodge(1), width=.2) + 
  stat_pvalue_manual(pwc_ordered, label = "p.adj.signif", tip.length = 0.02, step.increase = 0.1, hide.ns = TRUE, 
                     y.position = c(5.5, 5.75, 5, 5.25, 6.5, 6.75, 6, 6.25), # 顺序和pwc_ordered的行完全匹配
                     label.size = 3)

小提示

  • 调整完后可以先运行print(pwc_ordered)确认行顺序是否正确,再绘图,避免出错。
  • 如果还是有重叠,可以微调step.increase或者y.position的数值,让括号布局更美观。

内容的提问来源于stack exchange,提问作者becbot

火山引擎 最新活动