我有一个产生情节的功能,我跑了六次。我想提取每个图,然后用每个图绘制一个多面板图,只有一个图例。
我尝试使用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)
}
答案 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)
<强>简介:强>
答案 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
给出了这个精彩的情节: