问题是由于某些因子组合的单元格不存在。可以通过以下方式检查cyl
和的所有级别组合的数据点数量:drv
xtabs
tab <- xtabs( ~ drv + cyl, mpg)
tab
# cyl
# drv 4 5 6 8
# 4 23 0 32 48
# f 58 4 43 1
# r 0 0 4 21
有三个空单元格。我将添加假数据来覆盖可视化问题。
检查因变量的范围(y 轴)。假数据需要超出这个范围。
range(mpg$cty)
# [1] 9 35
mpg
使用绘图所需的数据创建 的子集:
tmp <- mpg[c("cyl", "drv", "cty")]
为空单元格创建索引:
idx <- which(tab == 0, arr.ind = TRUE)
idx
# row col
# r 3 1
# 4 1 2
# r 3 2
创建三个假行(将 -1 作为 的值cty
):
fakeLines <- apply(idx, 1,
function(x)
setNames(data.frame(as.integer(dimnames(tab)[[2]][x[2]]),
dimnames(tab)[[1]][x[1]],
-1),
names(tmp)))
fakeLines
# $r
# cyl drv cty
# 1 4 r -1
#
# $`4`
# cyl drv cty
# 1 5 4 -1
#
# $r
# cyl drv cty
# 1 5 r -1
将行添加到现有数据:
tmp2 <- rbind(tmp, do.call(rbind, fakeLines))
阴谋:
library(ggplot2)
ggplot(tmp2, aes(x = as.factor(cyl), y = cty, fill = as.factor(drv))) +
geom_boxplot() +
coord_cartesian(ylim = c(min(tmp$cty - 3), max(tmp$cty) + 3))
# The axis limits have to be changed to suppress displaying the fake data.