在刻面图中用N注释x轴

时间:2016-08-17 21:53:12

标签: 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

下面的情节比我想要的更接近上面的情节,因为它有一个很好的治疗和访问层次结构,以及描绘访问的漂亮格式。但是,对于每个面板,它会从与处理条件匹配的摘要数据中的第一行抓取Ns,因为它不会知道&#34;每个方面都需要使用与该访问相对应的行。

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

2 个答案:

答案 0 :(得分:2)

一种解决方法是操纵数据集,使x变量成为trtN之间的互动。

取消您已有的内容,您可以通过Nmerge添加到原始数据集。

test = merge(data, data.sum)

然后创建一个新变量,它是trtN的组合。

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 

enter image description here

答案 1 :(得分:1)

由于此功能未构建在良好的解决方案中grid.extra

library(gridExtra)
p1    <- ggplot(data[data$vis==1,]) +     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=lb[1:2]) + #paste(data.sum$trt,data.sum$N,sep="\n")
  labs(x="Visit") + mytheme

p2    <- ggplot(data[data$vis==2,]) +     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=lb[3:4]) + #paste(data.sum$trt,data.sum$N,sep="\n")
  labs(x="Visit") + mytheme

p3    <- ggplot(data[data$vis==3,]) +     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=lb[5:6]) + #paste(data.sum$trt,data.sum$N,sep="\n")
  labs(x="Visit") + mytheme


grid.arrange(p1,p2,p3,nrow=1,ncol=3) # fully customizable

enter image description here

相关: Varying axis labels formatter per facet in ggplot/R

您也可以将它们垂直或进行其他转换:

enter image description here