R:ggplot2 - 每个方面的 Kruskal-Wallis 测试
R: ggplot2 - Kruskal-Wallis test per facet
我有多个方面的箱线图,我想对每个方面执行 Kruskal-Wallis 检验,并将结果放在每个相应方面的左上角。
为了举例说明这一点,我正在使用 iris 数据集,我向该数据集添加了一个名为 "treatment".
的附加变量
MWE:
library(reshape2)
library(ggplot2)
data(iris)
iris$treatment <- rep(c("A","B"), length(iris$Species)/2)
mydf <- melt(iris, measure.vars=names(iris)[1:4])
mydf$treatment <- as.factor(mydf$treatment)
mydf$variable <- factor(mydf$variable, levels=sort(levels(mydf$variable)))
ggplot(mydf,aes(x=variable, y=value)) +
geom_boxplot(aes(fill=Species)) +
facet_grid(treatment~Species, scales="free", space="free_x") +
geom_text(label=paste("Kruskal-Wallis, p=", with(mydf, kruskal.test(value ~ variable)$p.value)))
以上是我的最佳尝试,结果如下。
显然是错误的
我希望跨度量(Petal.Length、Petal.Width、Sepal.Length、Sepal.Width)的 Kruskal-Wallis 检验结果显示在左上角每个方面。
每个数据子集应执行 6 次测试(根据处理和物种),所以我想应该调整 p.value(最好由 Benjamini-Hochberg)。
如果可能的话,如果每个结果 p.value 都可以四舍五入到小数点后两位就更好了。如果可能的话,我宁愿避免使用 ggpubr,因为我对它有问题,并坚持使用 geom_text()。谢谢!
给出了解决方案here。
library(reshape2)
library(ggplot2)
data(iris)
iris$treatment <- rep(c("A","B"), length(iris$Species)/2)
mydf <- melt(iris, measure.vars=names(iris)[1:4])
mydf$treatment <- as.factor(mydf$treatment)
mydf$variable <- factor(mydf$variable, levels=sort(levels(mydf$variable)))
library(dplyr)
pv <- mydf %>% group_by(treatment, Species) %>%
summarize(p.value = kruskal.test(value ~ variable)$p.value)
ggplot(mydf,aes(x=variable, y=value)) +
geom_boxplot(aes(fill=Species)) +
facet_grid(treatment~Species, scales="free", space="free_x") +
geom_text(data=pv, aes(x=2, y=7, label=paste0("Kruskal-Wallis\n p=",p.value)))
我有多个方面的箱线图,我想对每个方面执行 Kruskal-Wallis 检验,并将结果放在每个相应方面的左上角。
为了举例说明这一点,我正在使用 iris 数据集,我向该数据集添加了一个名为 "treatment".
的附加变量MWE:
library(reshape2)
library(ggplot2)
data(iris)
iris$treatment <- rep(c("A","B"), length(iris$Species)/2)
mydf <- melt(iris, measure.vars=names(iris)[1:4])
mydf$treatment <- as.factor(mydf$treatment)
mydf$variable <- factor(mydf$variable, levels=sort(levels(mydf$variable)))
ggplot(mydf,aes(x=variable, y=value)) +
geom_boxplot(aes(fill=Species)) +
facet_grid(treatment~Species, scales="free", space="free_x") +
geom_text(label=paste("Kruskal-Wallis, p=", with(mydf, kruskal.test(value ~ variable)$p.value)))
以上是我的最佳尝试,结果如下。
显然是错误的
我希望跨度量(Petal.Length、Petal.Width、Sepal.Length、Sepal.Width)的 Kruskal-Wallis 检验结果显示在左上角每个方面。
每个数据子集应执行 6 次测试(根据处理和物种),所以我想应该调整 p.value(最好由 Benjamini-Hochberg)。
如果可能的话,如果每个结果 p.value 都可以四舍五入到小数点后两位就更好了。如果可能的话,我宁愿避免使用 ggpubr,因为我对它有问题,并坚持使用 geom_text()。谢谢!
给出了解决方案here。
library(reshape2)
library(ggplot2)
data(iris)
iris$treatment <- rep(c("A","B"), length(iris$Species)/2)
mydf <- melt(iris, measure.vars=names(iris)[1:4])
mydf$treatment <- as.factor(mydf$treatment)
mydf$variable <- factor(mydf$variable, levels=sort(levels(mydf$variable)))
library(dplyr)
pv <- mydf %>% group_by(treatment, Species) %>%
summarize(p.value = kruskal.test(value ~ variable)$p.value)
ggplot(mydf,aes(x=variable, y=value)) +
geom_boxplot(aes(fill=Species)) +
facet_grid(treatment~Species, scales="free", space="free_x") +
geom_text(data=pv, aes(x=2, y=7, label=paste0("Kruskal-Wallis\n p=",p.value)))