17

Rで箱ひげ図を描画しようとしています。私のコードは以下のとおりです。現時点では、2つのサイトのうちの1つに2か月分のデータしかないため、そのサイトのバーの幅が広くなっています(月の第3レベルが削除されているため)。

代わりに、サイトの場合と同じパターンのサイトのボックスAが必要ですB(つまり、右側に空のボックス用のスペースがあります)。ファクターが1つしかない場合は簡単にこれをdrop=TRUE行うことができますが、「充填」ファクターではできないようです。

Month=rep(c(rep(c("Jan","Feb"),2),"Mar"),10)
Site=rep(c(rep(c("A","B"),each=2),"B"),10)
factor(Month)
factor(Site)
set.seed(1114)
Height=rnorm(50)
Data=data.frame(Month,Site,Height)
plot = ggplot(Data, aes(Site, Height)) +
       geom_boxplot(aes(fill=Month, drop=TRUE), na.rm=FALSE)
plot
4

3 に答える 3

24

偽のデータの作成に基づく解決策は次のとおりです。

まず、新しい行がデータフレームに追加されます。これには、因子レベル(MarおよびA)の存在しない組み合わせのデータポイントが含まれています。の値はHeight、実際のHeightデータの範囲外である必要があります。

Data2 <- rbind(Data, data.frame(Month = "Mar", Site = "A", Height = 5))

次に、プロットを生成できます。偽のデータは表示されないはずなので、y軸の制限はcoord_cartesian元のデータの範囲で変更する必要がありHeightます。

library(ggplot2)
ggplot(Data2, aes(Site, Height)) +
  geom_boxplot(aes(fill = Month)) +
  coord_cartesian(ylim = range(Data$Height) + c(-.25, .25))

ここに画像の説明を入力してください

于 2013-03-12T18:10:33.460 に答える
14

目的の外観を実現する1つの方法は、プロット中に生成されたデータを変更することです。

まず、プロットをオブジェクトとして保存してから、を使用ggplot_build()してプロットデータのすべての部分をオブジェクトとして保存します。

p<-ggplot(Data, aes(Site, Height,fill=Month)) + geom_boxplot()
dd<-ggplot_build(p)

リスト要素データには、プロットに使用されるすべての情報が含まれています。

dd$data

[[1]]
     fill      ymin      lower     middle      upper      ymax  outliers notchupper notchlower    x PANEL
1 #F8766D -1.136265 -0.2639268  0.1978071  0.5318349 0.9815675            0.5954014 -0.1997872 0.75     1
2 #00BA38 -1.264659 -0.6113666  0.3190873  0.7915052 1.0778202            1.0200180 -0.3818434 1.00     1
3 #F8766D -1.329028 -0.4334205  0.3047065  1.0743448 1.5257798            1.0580462 -0.4486332 1.75     1
4 #00BA38 -1.137494 -0.7034188 -0.4466927 -0.1989093 0.1859752 -1.759846 -0.1946196 -0.6987658 2.00     1
5 #619CFF -2.344163 -1.2108919 -0.5457815  0.8047203 2.3773189            0.4612987 -1.5528617 2.25     1
  group weight ymin_final ymax_final  xmin  xmax
1     1      1  -1.136265  0.9815675 0.625 0.875
2     2      1  -1.264659  1.0778202 0.875 1.125
3     3      1  -1.329028  1.5257798 1.625 1.875
4     4      1  -1.759846  0.1859752 1.875 2.125
5     5      1  -2.344163  2.3773189 2.125 2.375

xあなたは、xmaxそして価値観に興味がありxminます。最初の2行はレベルに対応しますA。これらの値は変更する必要があります。

dd$data[[1]]$x[1:2]<-c(0.75,1)
dd$data[[1]]$xmax[1:2]<-c(0.875,1.125)
dd$data[[1]]$xmin[1:2]<-c(0.625,0.875)

ggplot_gtable()次に、とを使用して、grid.draw()変更されたデータをプロットします。

library(grid)
grid.draw(ggplot_gtable(dd))

ここに画像の説明を入力してください

于 2013-03-12T17:47:59.190 に答える
1

ここを参照してください。位置に「preserve」を使用して、これを行う簡単な方法があります。上記のプロットの場合、これは次のようになります。

Month = rep(c(rep(c("Jan", "Feb"), 2), "Mar"), 10)
Site = rep(c(rep(c("A", "B"), each = 2), "B"), 10)

factor(Month)
factor(Site)

set.seed(1114)

Height = rnorm(50)
Data = data.frame(Month, Site, Height)

plot = ggplot(Data, aes(Site, Height)) +
  geom_boxplot(
    aes(fill = Month, drop = TRUE),
    na.rm = FALSE,
    ## Note:
    position = position_dodge(preserve = 'single')
  )
plot

プロット

于 2021-11-09T14:04:57.007 に答える