tctcab
谢谢您提供了更改变量因子水平的管道写法哈!
其他问题解决如下。
问题2:只有中间“city”一列显示了p值并且出现如下警告信息
问题3:在以上问题基础上,能否将所显示的p值换成显著性符号,如p>0.05的话就显示“ns”,反之显示“*”等?
原打算用ggpubr::stat_compare_means()
进行kruskal非参数检验并将结果直接画到各个对应小图中,现在决定换个思路,用kruskal.test()
做检验,提取p值和对应的检验变量对到一个矩阵中,再将该矩阵映射到ggplot
中作图。
问题4:在调整拼图顺序时,有没有更方便的写法?
除了构造因子水平顺序,还没想出其他方法。
具体代码如下:
# 构造数据集
{
set.seed(1234)
mydata <- data.frame("plot"=seq(1:30),
"gdp"=runif(30, min = 50, max = 60),
"population"=runif(30, min = 10, max = 20),
"index"=runif(30, min = 30, max = 40),
"city"=rep(c("city1", "city2", "city3"), times=10),
"group"=rep(c("group1", "group2", NA), each=10),
"area"=rep(c("area1", "area2", "area3", "area4", "area5"), each=6))
# 该数据第一列为样地编号
# “gdp”、“population”和“index”为几个测量指数
# 而“city”、“group”和“area”是样地的属性
}
# 计算kruskal-wallis非参数检验结果并将结果存入之后作图用的注释矩阵pvalue中
pvalue_list <- vector("list",3)
for (i in c("gdp", "population", "index")) {
for (j in c("city", "group", "area")) {
pvalue_list[[1]] <- c(pvalue_list[[1]], i)
pvalue_list[[2]] <- c(pvalue_list[[2]], j)
pvalue_list[[3]] <- c(pvalue_list[[3]], round(kruskal.test(mydata[, i] ~ mydata[, j])$p.value,3))
}
}
pvalue <- data.frame(indicator = pvalue_list[[1]],
attr = pvalue_list[[2]],
pvalue = pvalue_list[[3]])
pvalue$label <- NA
pvalue$label[pvalue$pvalue>0.5] <- paste("p=", pvalue$pvalue[pvalue$pvalue>0.5], sep = "")
pvalue$label[pvalue$pvalue<0.5 & pvalue$pvalue>0.1] <-
paste("p=", pvalue$pvalue, "*", sep = "")[pvalue$pvalue<0.5 & pvalue$pvalue>0.1]
pvalue$label[pvalue$pvalue<0.1 & pvalue$pvalue>0.01] <-
paste("p=", pvalue$pvalue, "**", sep = "")[pvalue$pvalue<0.1 & pvalue$pvalue>0.01]
pvalue$label[pvalue$pvalue<0.01 & pvalue$pvalue>0] <-
paste("p=", pvalue$pvalue, "***", sep = "")[pvalue$pvalue<0.01 & pvalue$pvalue>0]
# 该注释矩阵的维度和之后作图的维度一致
# 将原始数据mydata转化成长数据并作图
# 载入包
library(tidyr)
library(ggplot2)
# 作图,并将注释矩阵pvalue映射到各个对应的小图中
mydata %>%
pivot_longer(cols = c("gdp", "population", "index"),
names_to = "indicator",
values_to = "indicator_value") %>%
pivot_longer(cols = c("city", "group", "area"),
names_to = "attr",
values_to = "attr_value",
values_drop_na = TRUE) %>%
# 谢谢tctcab提供更改变量因子水平的管道符编程写法
mutate(indicator = factor(indicator, levels = c("gdp", "population", "index")),
attr = factor(attr, levels = c("city", "group", "area"))) %>%
ggplot(aes(x=attr_value, y=indicator_value)) +
geom_boxplot() +
facet_grid(indicator ~ attr, switch = "both", scale = "free") +
geom_text(data = pvalue, aes(x =Inf, y = Inf, label = label), size=5, hjust = 1.05, vjust = 1.5)
# 出图如下
但是现在有个新的问题:如何调整各个小图的y轴高度,以免作为注释的p值和箱线图重叠?
以及以上代码应该如何简化?比如说注释矩阵pvalue的写法应该如何简化呢?
还请各位指教啦 😃