r - 按 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)
. 谢谢你。
解决方案
感觉应该有一个比这个解决方案更简单、更优雅的方法,但是这里有。
该方法:
- 创建一个列表列,其中
am
和mpg
嵌套在下面carb
- 过滤只有 2 个唯一级别的行
am
(l == 2) - 运行
t.test
并添加具有 p 值的列 - 加入
carb
并pval
返回原始数据 - order by
pval
并按carb
所需顺序制作一个因子(bypval
) - 现在我们可以
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")
结果:
推荐阅读
- c++ - 获取围绕中心的圆圈中的点的有效算法
- html - Safari上的引导列未对齐
- sql - 你能加入两个表并得到一个包含 obj 列表(来自第二个表)的 obj(来自第一个表)
- asp.net-mvc-4 - Active Directory 和 IIS 服务器不在同一个域时怎么办?
- java - JProgressBar 更新和线程调度
- python - 如何修改双端队列列表?
- r - 为多个参数的所有排列泛化 lapply/map
- spring-data-graph - 如何使用 DatagramPacket 和 DatagramSocket 类创建服务器-客户端应用程序?
- c# - 如何在 Asp.Net Core 2.2 运行时禁用/启用身份验证?
- c# - OrderedTest 返回 TestMethod 以外的另一个目录