[英]Facet/separate boxplots in R when formula is used and outliers are not drawn? (ggplot2 or r basics)
我有一個稱為samples_type的數據框:
Status variable value
PAT SPP1 1,994629e+00
PAT SPP1 1,179033e+00
PAT SPP1 2,901539e+00
PAT SPP1 1,140857e+00
PAT SPP1 1,467056e+00
PAT SPP1 2,579037e+00
“狀態”列可以采用兩個值:PAT或CON。 “變量”列可以采用許多值: SPP1,CCL24,ENG56 ...
我想對Status:variable的每個組合進行值的箱形圖繪制。
目前,我有兩個代碼:
boxplot(value ~ Status:variable, data=samples_type,
col=c("red", "limegreen"), las=2, outline=F)
和:
p0 <- ggplot(data = samples_J0_type, aes(x=variable, y=value)) +
geom_boxplot(aes(fill=Status)) +
facet_wrap( ~ variable, scales="free")
第一個代碼在一張圖中為我提供了所有框線圖,沒有異常值。 我想將它們分開,因為par(mfrow = c(...,...))會做到這一點。 我怎樣才能做到這一點?
在第二個代碼中,我使用了ggplot2。 如您所見,我設法將盒線圖分開, 但我沒有設法刪除離群值,並且由於離群值,我的盒線圖很小。 如何刪除異常值? 我在StackOverFlow上檢查了如何使用ggplot2刪除離群值,但發現了僅一個boxplot而不是多個boxplot的答案。 我不知道該怎么做...
編輯:每個代碼的箱線圖
一般
由於您沒有提供最小的數據集,因此很難提供幫助,因此我不得不退回到現有的數據上。
mt <- mtcars %>% select(cyl, mpg, am)
## add some outliers
mt <- rbind(mt, data.frame(cyl = c(4, 6, 8), mpg = rep(100, 3), am = 0))
基數R
您可以根據變量之一拆分數據,相應地設置mfrow
並使用apply
函數分別生成每個圖:
## split your data according to one variable
dl <- split(mt, mt$am)
## set the mfrow
par(mfrow = 1:2)
## something more educated would be something like this
## needs to be adapted for border cases
## par(mfrow = c(ceiling(sqrt(length(dl))), ceiling(sqrt(length(dl)))))
## loop through all data sets
lapply(dl, function(d) boxplot(mpg ~ cyl, data = d, outline = FALSE))
但是, boxplot(. outliers = TRUE)
並不會真正刪除異常值,而是擴展了晶須。
ggplot
對於第二個問題,您可以先通過
geom_boxplot(aes(fill = Status), outlier.shape = NA)
然后根據您的數據通過ylim
調整y范圍。
注意 。 從技術上講, outlier.shape = NA
如果您使用超出范圍的ylim
點,則無論如何都將刪除掉outlier.shape = NA
,但是它會使代碼更加冗長,以顯示您想要做什么。
內置數據集示例
library(tidyverse)
## plot w/ outliers shown
ggplot(mt, aes(x = factor(cyl), y = mpg)) +
geom_boxplot() +
facet_wrap(~am)
## plot with outliers removed
ggplot(mt, aes(x = factor(cyl), y = mpg)) +
geom_boxplot(outlier.shape = NA) +
facet_wrap(~am) +
ylim(c(0, 50))
警告
在您的更新中,您添加了繪圖,我看到您有自由比例尺,這將使此方法無用,因為您不能在每個面板上指定ylim
。
感謝@thothal,我發布了有效的最終代碼:
dl = split(samples_type, samples_type$variable)
par(mfrow = c(ceiling(sqrt(length(dl))),ceiling(sqrt(length(dl)))))
iwalk(dl, ~ boxplot(value ~ Status , data = .x,
outline = FALSE,col=c("red", "limegreen"), main=.y))
軟件包“ purrr”中的“ iwalk”。
要記住,數據框的頭部samples_type :
Status variable value
PAT SPP1 1,994629e+00
PAT SPP1 1,179033e+00
PAT SPP1 2,901539e+00
PAT SPP1 1,140857e+00
PAT SPP1 1,467056e+00
PAT SPP1 2,579037e+00
“狀態”列可以采用兩個值:PAT或CON。 “變量”列可以采用許多值:SPP1,CCL24,ENG56 ...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.