我正在尝试将 Kruskal Wallis p 值添加到我的箱线图中,尽管我已经看到很多包含该解决方案的帖子,但我无法使其工作。
这是我的数据和运行箱线图的代码:
library(ggplot2)
library(dplyr)
set.seed(1234)
Gene <- floor(runif(25, min=0, max=101))
Age <- floor(runif(25, min=18, max=75))
Group <- c("Group1", "Group1", "Group3", "Group2", "Group1", "Group3", "Group2", "Group2", "Group2", "Group1", "Group1", "Group3", "Group1", "Group2", "Group1", "Group2", "Group3", "Group1", "Group3", "Group3", "Group2", "Group1", "Group3", "Group3","Group2")
df <- data.frame(Gene, Age, Group)
mybreaks <- seq(min(df$Age)-1, to=max(df$Age)+10, by=10)
df$groups_age <- cut(df$Age, breaks = mybreaks, by=10)
bp <- ggplot(df, aes(x=groups_age, y=Gene, group=groups_age)) +
geom_boxplot(aes(fill=groups_age)) +
facet_grid(. ~ Group)
bp
在此post ,我看到一种方法可以做到这一点,但是当我尝试执行相同操作时,我收到此错误 Error in FUN(X[[i]], ...) : object 'groups_age' not found
并且未显示该图。
代码:
pv <- df %>%
group_by(Group) %>%
summarize(Kruskal_pvalue = kruskal.test(Gene ~ groups_age)$p.value)
bp <- ggplot(df, aes(x=groups_age, y=Gene, group=groups_age)) +
geom_boxplot(aes(fill=groups_age)) +
facet_grid(. ~ Group) +
geom_text(data=pv, aes(x=2, y=75, label=paste0("Kruskal-Wallis\n p=",Kruskal_pvalue)))
bp
请注意,我手动输入了 x 和 y,只是为了放置值。但是,我想更自动地执行此操作,具体取决于基因的值(如果它发生变化)。
有谁知道我为什么会收到该错误以及为什么它不起作用?
提前非常感谢
问候
最佳答案
问题在于您使 group=groups_age
成为一种全局审美。所有图层都将继承全局 aes,因此所有图层都将在提供给图层的数据中查找名为 groups_age
的列。由于 geom_text
中使用的数据 pv
不包含此名称的列,因此您会收到错误。
要解决您的问题,您可以删除 group=groups_age
,因为您的情况不需要它。对于更一般的情况,您必须更具体地说明您创建的本地
或全局
aes。此外,每个 geom 都有一个 inherits.aes
参数(默认情况下为 TRUE
),以防止继承全局 aes:
library(ggplot2)
bp <- ggplot(df, aes(x = groups_age, y = Gene)) +
geom_boxplot(aes(fill = groups_age)) +
facet_grid(. ~ Group) +
geom_text(data = pv, aes(x = 2, y = 75, label = paste0("Kruskal-Wallis\n p=", Kruskal_pvalue)))
bp
由 reprex package 于 2021 年 12 月 21 日创建(v2.0.1)
关于r - 在 R 中使用facet_grid 将 Kruskal Wallis p 值添加到箱线图中时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70432871/