使用 ggplot 和 n > 5 的箱线图

boxplot using ggplot with n > 5

我确定这个问题以前有人问过。但我找不到任何类似的东西。所以考虑一个简单的例子

我们创建随机数据,然后创建箱线图:

set.seed(123456)
Ax <- sample(1:3, size = 75, replace = T)
Fac <- sample(LETTERS[1:4], 75, replace = T)
yvalue <- runif(75)

df1 <- data.frame(Ax, Fac, yvalue)

library(ggplot2)
ggplot(df1, aes(factor(Ax), yvalue, colour = Fac)) + 
  geom_boxplot()

但我们更仔细地审查了我们的数据:

table(df1$Ax, df1$Fac)

我想创建一个像上面那样的箱线图,但是当组大小 (n=) 小于 6 时,则:

这是针对以下红色圆圈中阴影的数据

如果您不关心箱线图曾经所在位置的占位符空间,您可以简单地删除不符合您标准的观察结果。下面的示例使用 dplyr 进行数据操作

library(dplyr)
library(ggplot2)

### Identify all groups that have > 5 observations per group
df2 <- df1 %>%  group_by(Fac , Ax) %>%  summarise( n = n()) %>%  filter ( n > 5)

### Only keep groups that meet our criteria 
df3 <- df1 %>%  semi_join(df2 , by = c("Fac" , "Ax") )

ggplot(df3, aes(factor(Ax), yvalue, colour = Fac)) + 
  geom_boxplot()

你可以试试:

使用 ave()

包含出现的列
df1$length <- ave(df1$yvalue, interaction(df1$Ax, df1$Fac), FUN=length)

现在例如调整 alpha 以绘制 uncoloured/shaded 个框:

ggplot(df1, aes(factor(Ax), yvalue, fill = Fac, alpha=factor(ifelse(df1$length < 6 ,0.5, 1)))) + 
geom_boxplot()