我正在尝试生成一些按治疗条件和访问次数分割的数字结果的箱线图,每个框中的观察次数都放在图下方,并且也标记了访问次数。这里有一些虚假数据可以用来说明,我举了两个我尝试过但不太有效的例子。
library(ggplot2)
library(plyr)
trt <- factor(rep(LETTERS[1:2],150),ordered=TRUE)
vis <- factor(c(rep(1,150),rep(2,100),rep(3,50)),ordered=TRUE)
val <- rnorm(300)
data <- data.frame(trt,vis,val)
data.sum <- ddply(data, .(vis, trt), summarise,
N=length(na.omit(val)))
mytheme <- theme_bw() + theme(panel.margin = unit(0, "lines"), strip.background = element_blank())
下面的代码生成一个图,其中有我想要的 N 个标签。它通过从我创建的辅助数据集中获取摘要数据来实现此目的。但是,我不知道如何在 x 轴上标记访问(理想情况下在各个框标签下方),或以其他方式直观地描述访问(例如,将它们分隔成面板的线)。
plot1 <- ggplot(data) +
geom_boxplot(aes(x=vis:trt,y=val,group=vis:trt,colour=trt), show.legend=FALSE) +
scale_x_discrete(labels=paste(data.sum$trt,data.sum$N,sep="\n")) +
labs(x="Visit") + mytheme
下面的图比上面的更接近我想要的,因为它有一个很好的治疗和访问层次结构,以及描述访问的漂亮格式。然而,对于每个面板,它从与处理条件匹配的摘要数据的第一行获取 N,因为它不“知道”每个方面需要使用与该访问相对应的行。
plot2 <- ggplot(data) + geom_boxplot(aes(x=trt,y=val,group=trt,colour=trt), show.legend=FALSE) +
facet_wrap(~ vis, drop=FALSE, switch="x", nrow=1) +
scale_x_discrete(labels=paste(data.sum$trt,data.sum$N,sep="\n")) +
labs(x="Visit") + mytheme
最佳答案
一种解决方法是操作数据集,使 x 变量成为 trt
和 N
之间的交互作用。
利用已有的数据,您可以通过合并
将N
添加到原始数据集。
test = merge(data, data.sum)
然后创建一个由 trt
和 N
组合而成的新变量。
test = transform(test, trt2 = paste(trt, N, sep = "\n"))
现在绘制图表,在 x 轴上使用新的 trt2
变量,并在 facet_wrap
中使用 scales = "free_x"
以允许每个方面都有不同的标签。
ggplot(test) +
geom_boxplot(aes(x = trt2, 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
关于r - 在多面图中用 N 注释 x 轴,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39006840/