从函数中提取绘图并绘制为一个项目

时间:2014-09-02 13:37:58

标签: r ggplot2

我有一个产生情节的功能,我跑了六次。我想提取每个图,然后用每个图绘制一个多面板图,只有一个图例。

我尝试使用assign函数和return来提取我的情节,但我似乎无法让它工作。

我的代码:

levels = c('Genus','Family','Order','Class','Phylum','Domain')

Taxon_senPrec_func = function(x){
  df = subset(d, Taxonomic_level == x)

  q=ggplot(df, aes(x=Sensitivity, y=Precision, col=Database, shape=ID_cutoff)) +
    geom_point(size=3) +
    ggtitle(
      paste('The ',x,' sensitivity and precision of various annotation techniques.', 
            sep='')) +
    ylim(0,100) +
    xlab('Sensitivity (%)') +
    ylab('Precision (%)') +
    scale_shape_manual(values=1:9)

  p = assign(paste("plot_",x,sep=""), q)
  return(p)
}

for(level in levels){
  Taxon_senPrec_func(level)
}

2 个答案:

答案 0 :(得分:3)

为了扩展facet_grid评论,我们尝试使用自定义函数分别根据一个data.frame的子集绘制多个图,然后尝试将它们组合成一个图,为什么不使用facet_grid。 / p>

示例:

require(ggplot2)

#reproducible dummy data
set.seed(123)
df <- data.frame(Sensitivity=runif(600,1,100),
                 Precision=runif(600,1,100),
                 Database=sample(c("DB1","DB2","DB3"),600,replace = TRUE),
                 ID_cutoff=sample(LETTERS[1:4],600,replace = TRUE),
                 my_levels = c('Genus','Family','Order','Class','Phylum','Domain'))

#plot with facet
ggplot(df, aes(x=Sensitivity, y=Precision, col=Database, shape=ID_cutoff)) +
  geom_point(size=3) +
  facet_grid(.~my_levels) +
  ggtitle('The sensitivity and precision of various annotation techniques.') +
  ylim(0,100) +
  xlab('Sensitivity (%)') +
  ylab('Precision (%)') +
  scale_shape_manual(values=1:9)

<强>简介:

enter image description here

答案 1 :(得分:2)

一种方法是使用多值函数(来自here),如下所示:

multiplot <- function(..., plotlist=NULL, file, cols=1, layout=NULL) {
  require(grid)

  plots <- c(list(...), plotlist)

  numPlots = length(plots)

  if (is.null(layout)) {

    layout <- matrix(seq(1, cols * ceiling(numPlots/cols)),
                     ncol = cols, nrow = ceiling(numPlots/cols))
  }

  if (numPlots==1) {
    print(plots[[1]])

  } else {

    grid.newpage()
    pushViewport(viewport(layout = grid.layout(nrow(layout), ncol(layout))))


    for (i in 1:numPlots) {
      matchidx <- as.data.frame(which(layout == i, arr.ind = TRUE))

      print(plots[[i]], vp = viewport(layout.pos.row = matchidx$row,
                                      layout.pos.col = matchidx$col))
    }
  }
}

并且可以像这样使用它:

library(ggplot2); 
library(grid)

q1<-ggplot(...) #your first graph
q2<-ggplot(...) # your second graph
...
q6<-ggplot(...) # 6-th graph

然后致电multiplot(q1,q2,q3,q4,q5,q6,cols=3)。有多种替代方法:请参阅使用grid.arrange的{​​{3}},当然还有ggplot附带的构面类型:facet_grid(如Baptiste所说)和{ {1}},后者可以像这样使用(随机/伪数据):

facet_wrap

给出了这个精彩的情节:

enter image description here