首页 > 解决方案 > 按 p 值排序 geom_boxplot

问题描述

我正在使用以下代码。

 library(ggplot2)
 library(ggpubr)
 mtcars$carb <- as.factor(mtcars$carb)
 mtcars$am <- as.factor(mtcars$am)
 ggplot(mtcars) + 
     geom_boxplot(aes(x = carb, y = mpg, fill = am), 
         position = position_dodge(0.9)) + 
     stat_compare_means(aes(x = carb, y = mpg, group = am), label = "p.format")

这导致了这个情节: 在此处输入图像描述

我怎样才能将 p 值从低到高排序,以便 x 轴上的顺序变为 carb = 2, 1, 4, 3, 6, 8?

请注意,我需要将其应用于更大的数据集,因此我需要使用 p 值进行排序,而不是像c(2,1,4,3,6,8). 谢谢你。

标签: rggplot2boxplot

解决方案


感觉应该有一个比这个解决方案更简单、更优雅的方法,但是这里有。

该方法:

  • 创建一个列表列,其中ammpg嵌套在下面carb
  • 过滤只有 2 个唯一级别的行am(l == 2)
  • 运行t.test并添加具有 p 值的列
  • 加入carbpval返回原始数据
  • order bypval并按carb所需顺序制作一个因子(by pval
  • 现在我们可以ggplot

代码。请注意,我t.test在这两种情况下都使用比较均值,因此 p 值与您的不同,我认为默认情况下使用 wilcox 测试。

library(tidyverse)
library(ggpubr)

mtcars %>% 
  select(carb, am, mpg) %>% 
  mutate(am = factor(am)) %>% 
  nest(am, mpg)  %>% 
  mutate(l = map_int(data, ~unique(.$am) %>% length)) %>% 
  filter(l == 2) %>% 
  mutate(pval = map_dbl(data, ~t.test(mpg ~ am, .)$p.value)) %>% 
  select(carb, pval) %>% 
  right_join(mtcars) %>% 
  arrange(pval) %>% 
  mutate(carb = factor(carb, levels = unique(.$carb)), 
         am = factor(am)) %>% 
  ggplot(aes(carb, mpg)) + 
  geom_boxplot(aes(fill = am)) + 
  stat_compare_means(aes(carb, mpg, group = am), 
                     label = "p.format", 
                     method = "t.test")

结果:

在此处输入图像描述


推荐阅读