我有一个数据框,其中包含一列分类数据(两个可能的值)和多个变量列。我需要绘制多个箱形图,每个变量列一个。每个图比较第1列中给出的两个分类组之间的变量值。到目前为止,我通过为每列编写单独的图调用来实现它。
#CREATE DATASET
mydata <- data.frame(matrix(rlnorm(30*10,meanlog=0,sdlog=1), nrow=30))
colnames(mydata) <- c("categ", "var1","var2", "var3","var4", "var5", "var6", "var7", "var8", "var9")
mydata$var2 <- mydata$var2*5
mydata$categ <- sample(1:2)
mydata
#LAYOUT
par(mfrow=c(3,3), mar=c(4,4,0.5,0.5), mgp = c(1.5, 0.3, 0), tck = -0.01)
#BOXPLOTS
boxplot(var1 ~ categ, data = mydata, outpch = NA, ylim = c(0, 8), Main = "Title", ylab="VarLevel", tck = 1.0, names=c("categ1","categ2"))
stripchart(var1 ~ categ, data = mydata, vertical = TRUE, method = "jitter", ylim = c(0, 8), pch = 21, cex = 1, col=c(rgb(255, 0, 0, 100, max = 255), rgb(0, 0, 255, 100, max = 255)), bg = rgb(255, 255, 255, 10, max = 255), add = TRUE)
test <- wilcox.test(var1 ~ categ, data = mydata)
pvalue <- test$p.value
pvalueformatted <- format(pvalue, digits=3, nsmall=2)
mtext(paste(colnames(mydata)[2], " p = ", pvalueformatted), side=1, line=-13, at=0.9, cex = 0.6)
boxplot(var2 ~ categ, data = mydata, outpch = NA, ylim = c(0, 40), Main = "Title2", ylab="VarLevel", tck = 1.0, names=c("categ1","categ2"))
stripchart(var2 ~ categ, data = mydata, vertical = TRUE, method = "jitter", ylim = c(0, 40), pch = 25, cex = 1, col=c(rgb(255, 0, 0, 100, max = 255), rgb(0, 0, 255, 100, max = 255)), bg = rgb(255, 255, 255, 10, max = 255), add = TRUE)
test <- wilcox.test(var2 ~ categ, data = mydata)
pvalue <- test$p.value
pvalueformatted <- format(pvalue, digits=3, nsmall=2)
mtext(paste(colnames(mydata)[3], " p = ", pvalueformatted), side=1, line=-13, at=0.9, cex = 0.6)
两个问题:
1)我想使用函数或for循环来编写每个数据列的绘图调用。不知道该怎么做。我看到了一些相关的帖子,但无法到达那里。现在尝试使用基本功能,但如果需要可以考虑使用ggplot或其他功能
2)作为循环/函数的一部分,有没有办法调整每个图的y轴刻度以适应变量的范围?因此,对于给定的列,如果最大值为2,则y轴刻度将增加到4.如果最大值为100,则y轴将上升到110.
赞赏的想法
答案 0 :(得分:2)
我会sapply
通过列号向量和子集mydata
到函数中感兴趣的列。通过迭代列号而不是列本身,您可以轻松访问以后添加到图中的正确colname
。
您还需要在第3面(顶部)添加一个小的外边距(oma
),以便在前3个图中可以打印p值。
要解决第二个问题 - 减少y限制以适应数据范围 - 如果指定outline=FALSE
来禁止绘制异常值,则会自动执行此操作。 (在您的代码中,您只是提供了NA
作为绘图字符来隐藏它们,但boxplots
在确定轴限制时仍然认为它们是数据的一部分。)但是,通过设置{{1} },计算的y限制将不适应任何异常值,否则这些异常值将被outline=FALSE
调用(我现在已将其修改为stripchart
,因为它更简单一些)。
points
注意我还修改了par(mfrow=c(3,3), mar=c(3, 3, 0.5, 0.5), mgp = c(1.5, 0.3, 0), tck = -0.01,
oma=c(0, 0, 1, 0))
sapply(seq_along(mydata)[-1], function(i) {
y <- mydata[, i]
boxplot(y ~ mydata$categ, outline=FALSE, ylab="VarLevel", tck = 1.0,
names=c("categ1","categ2"), las=1)
points(y ~ jitter(mydata$categ, 0.5),
col=ifelse(mydata$categ==1, 'firebrick', 'slateblue'))
test <- wilcox.test(y ~ mydata$categ)
pvalue <- test$p.value
pvalueformatted <- format(pvalue, digits=3, nsmall=2)
mtext(paste(colnames(mydata)[i], " p = ", pvalueformatted), side=3,
line=0.5, at=0.9, cex = 0.6)
})
调用第3面的情节,而不是指定第1面有较大的负边距。