15

次のように、 とが異なる変数にマップされxている箱ひげ図を作成しています。fill

ggplot(mpg, aes(x=as.factor(cyl), y=cty, fill=as.factor(drv))) + 
    geom_boxplot()

ここに画像の説明を入力

上記の例のように、との値xのすべての可能な組み合わせを持っているわけではないため、ボックスの幅は値によって異なります。xfill

すべてのボックスを同じ幅にしたいと思います。これを行うことはできますか (理想的には、基になるデータ フレームを操作せずに、偽のデータを追加すると、さらなる分析中に混乱が生じるのではないかと心配しています)?

私の最初の考えは

+ geom_boxplot(width=0.5)

しかし、これは役に立ちません。x指定された因子レベルの箱ひげ図の完全なセットの幅を調整します。

この投稿 はほとんど関連しているように見えますが、自分の状況に適用する方法がよくわかりません。を使用+ scale_fill_discrete(drop=FALSE)してもバーの幅は変わらないようです。

4

3 に答える 3

2

問題は、因子の組み合わせの一部のセルが存在しないことが原因です。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.

ここに画像の説明を入力

于 2013-05-23T06:46:12.013 に答える