r - 在多面图中用 N 注释 x 轴

标签 r ggplot2 facet-wrap

我正在尝试生成一些按治疗条件和访问次数分割的数字结果的箱线图,每个框中的观察次数都放在图下方,并且也标记了访问次数。这里有一些虚假数据可以用来说明,我举了两个我尝试过但不太有效的例子。

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 变量成为 trtN 之间的交互作用。

利用已有的数据,您可以通过合并N添加到原始数据集。

test = merge(data, data.sum)

然后创建一个由 trtN 组合而成的新变量。

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 

enter image description here

关于r - 在多面图中用 N 注释 x 轴,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39006840/

相关文章:

r - 如何提取列表中的第一项(即使列表为空)

r - 如何为每一行创建折线?

r - 使用 dplyr 计算组平均值和逻辑值之间的差异

r - 饼图和条形图在同一图上对齐

r - ggplot2:使用选定的面和零件数据创建绘图

r - ggplot2 facet_wrap 带有两个嵌套变量 : use different strip. 每个变量的位置/开关?

r - 如何考虑 R 中的纬度和经度值来计算两个不同变量的平均值?

r - ggplot2:用geom_bar绘制平均值

r - 如何在R中的不同方面产生不同的geom_vline?

r - 使用 facet wrap 在 R 中映射不同状态