在分面图中用 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=FALSE
和 scales="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)))
我昨天问了一个关于 annotating the x-axis with N in a faceted plot 的问题,使用了一个最小的例子,相对于我的实际问题来说,这个例子太简单了。那里给出的答案在完整数据的情况下有效,但是如果您缺少想要保留的方面,facet_wrap
选项 drop=FALSE
和 scales="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)))