在分面图中用 N 注释 x 轴,但保留空分面

Annotate x-axis with N in faceted plot, but preserve empty facets

我昨天问了一个关于 annotating the x-axis with N in a faceted plot 的问题,使用了一个最小的例子,相对于我的实际问题来说,这个例子太简单了。那里给出的答案在完整数据的情况下有效,但是如果您缺少想要保留的方面,facet_wrap 选项 drop=FALSEscales="free_x" 的组合会触发错误:"Error in if (zero_range(from) || zero_range(to)) { : missing value where TRUE/FALSE needed"

这是一个新的、不太简单的例子。这里的目标是使用 grid.arrange 生成一个包含两个面板的大图;第一个显示治疗组随时间变化的绝对值;第二个显示治疗组随时间从基线的变化。在第二个面板中,当 vis=1 时我们需要一个空白面。

# setup
library(ggplot2)
library(plyr)
library(gridExtra)

trt      <- factor(rep(LETTERS[1:2],150),ordered=TRUE)
vis      <- factor(c(rep(1,150),rep(2,100),rep(3,50)),ordered=TRUE)
id       <- c(c(1:150),c(1:100),c(1:50))
val      <- rnorm(300)
data     <- data.frame(id,trt,vis,val)
base     <- with(subset(data,vis==1),data.frame(id,trt,baseval=val))
data     <- merge(data,base,by="id")
data     <- transform(data,chg=ifelse(vis==1,NA,val-baseval))
data.sum <- ddply(data, .(vis, trt), summarise, N=length(na.omit(val)))
data     <- merge(data,data.sum)
data     <- transform(data, trtN=paste(trt,N,sep="\n"))
mytheme  <- theme_bw() + theme(panel.margin = unit(0, "lines"), strip.background = element_blank())

# no missing facets
plot.a   <- ggplot(data) + geom_boxplot(aes(x=trtN,y=val,group=trt,colour=trt), show.legend=FALSE) +
            facet_wrap(~ vis, drop=FALSE, switch="x", nrow=1, scales="free_x") +
            labs(x="Visit") + mytheme
# first facet should be blank
plot.b   <- ggplot(data) + geom_boxplot(aes(x=trtN,y=chg,group=trt,colour=trt), show.legend=FALSE) +
            facet_wrap(~ vis, drop=FALSE, switch="x", nrow=1, scales="free_x") +
            labs(x="Visit") + mytheme

grid.arrange(plot.a,plot.b,nrow=2)

您可以添加一个空白层来绘制第二个绘图中的所有小平面。关键是您需要一个存在于 vis 的每个级别的变量,以用作您的 y 变量。在您的情况下,您可以简单地使用您在第一个图中使用的变量。

ggplot(data) + 
    geom_boxplot(aes(x = trtN, y = chg, group = trt, colour = trt), show.legend = FALSE) +
    geom_blank(aes(x = trtN, y = val)) +
    facet_wrap(~ vis, switch = "x", nrow = 1, scales = "free_x") +
    labs(x="Visit") + mytheme

如果您的变量具有不同的范围,您可以使用箱线图 y 变量的总体最小值和最大值来设置 y 限制。

+ scale_y_continuous(limits = c(min(data$chg, na.rm = TRUE), max(data$chg, na.rm = TRUE)))