問題は、因子の組み合わせの一部のセルが存在しないことが原因です。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
3 つの空のセルがあります。視覚化の問題をオーバーライドするために偽のデータを追加します。
従属変数 (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
3 つの疑似行を作成します ( の値として -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.