使用公式且未绘制异常值时,R中的构面/单独的箱形图? (ggplot2或R基础)

时间:2019-04-09 08:58:45

标签: r ggplot2 boxplot

我有一个称为 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 with the first code Boxplot with the second code

2 个答案:

答案 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

但是,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 ...