我正在尝试生成一些按治疗条件和访问次数分割的数字结果的箱线图,每个框中的观察数放在图下方,并且还标记了访问次数。这里有一些虚假数据可以用来说明,我举了两个我尝试过但不太奏效的例子。
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
下面的图比上面的图更接近我想要的,因为它有一个很好的治疗和访问层次结构,以及一个很好的描述访问的格式。然而,对于每个面板,它从与处理条件匹配的汇总数据中的第一行获取 Ns,因为它不“知道”每个方面需要使用与该访问对应的行。
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
将 merge
添加到原始数据集。
test = merge(data, data.sum)
然后创建一个新变量,它是
trt
和 N
的组合。test = transform(test, trt2 = paste(trt, N, sep = "\n"))
现在绘制图,在 x 轴上使用新的
trt2
变量并在 scales = "free_x"
中使用 facet_wrap
以允许每个方面的不同标签。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/