在geom_boxplot中包含填充美学中使用的缺失因子级别的空间

17 r ggplot2 boxplot

我想在R画一个盒子和胡须图.我的代码如下.目前,由于我只在两个站点中的一个站点中有两个月的数据,因此该站点的栏数较宽(因为月份的第三个级别被删除).

相反,我想为站点提供A与站点相同的盒子模式B(即在右侧有空盒子的空间).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
Run Code Online (Sandbox Code Playgroud)

Sve*_*ein 21

这是一个基于创建虚假数据的解决方案:

首先,将新行添加到数据框中.它包含因子级别(MarA)的不存在组合的数据点.值Height必须在实际Height数据的范围之外.

Data2 <- rbind(Data, data.frame(Month = "Mar", Site = "A", Height = 5))
Run Code Online (Sandbox Code Playgroud)

然后,可以生成绘图.由于假数据不可见,因此必须使用coord_cartesian原始Height数据的范围修改y轴限制.

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

在此输入图像描述


Did*_*rts 14

实现所需外观的一种方法是更改​​绘图时生成的数据.

首先,将绘图保存为对象,然后使用ggplot_build()将绘图数据的所有部分保存为对象.

p<-ggplot(Data, aes(Site, Height,fill=Month)) + geom_boxplot()
dd<-ggplot_build(p)
Run Code Online (Sandbox Code Playgroud)

列表元素数据包含用于绘图的所有信息.

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
Run Code Online (Sandbox Code Playgroud)

你有兴趣x,xmaxxmin值.前两行对应于级别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)
Run Code Online (Sandbox Code Playgroud)

现在使用ggplot_gtable()grid.draw()绘制更改的数据.

library(grid)
grid.draw(ggplot_gtable(dd))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述