簡體   English   中英

使用 R 中的數據框列繪制多個箱線圖

[英]Plot multiple box-plots using columns of dataframe in R

我有一個包含一列分類數據(兩個可能的值)和多個變量列的數據框。 我需要繪制多個箱線圖,每個變量列一個。 每個圖比較第 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。

想法贊賞

我會sapply列數和子集的矢量超過mydata到的函數中感興趣的列。 通過迭代列號而不是列本身,您可以輕松訪問稍后添加到繪圖中的正確colname

您還需要在第 3 邊(頂部)添加一個小的外邊距 ( oma ),以便可以在那里打印前 3 個圖的 p 值。

為了解決您的第二個問題 - 減少 y 限制以適應數據范圍 - 如果您指定outline=FALSE以抑制異常值的繪制,這將是自動的。 (在您的代碼中,您只是提供NA作為繪圖字符來隱藏它們,但boxplots在確定軸限制時仍將它們視為數據的一部分。)但是,通過設置outline=FALSE ,計算的 y 限制將不會容納任何可能通過調用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)  
})

注意我還修改了您的mtext調用以在第 3 側繪圖,而不是指定具有較大負邊距的第 1 側。

箱線圖

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM