我有一个称为 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删除离群值,但我发现一个答案仅适用于一个箱形图,而不能用于多个箱形图。而且我不知道该怎么做...
编辑:每个代码的箱形图
答案 0 :(得分:3)
常规
由于您没有提供最小的数据集,因此很难提供帮助,因此我不得不退回到现有数据上。
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
,无论如何,超出范围的点都会被丢弃,但这会使代码更加冗长,以显示您想做什么。
带有内置数据集的示例
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
基础。
答案 1 :(得分:0)
感谢@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))
“ purr”包中的“ 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 ...