Fra*_*cis 4 r function vector parameter-passing ggplot2
也许这个问题已被提出并得到解决,但解决方案并不适用于我.我编写了一个能够创建ggplot对象并在向量中返回它们的函数.以下是函数内部的代码,vars是我的数据列名的向量d.
plotting <- function(d){
P <- numeric(0)
vars <- names(d)[!names(d)%in%c('channel','label')]
for (var in vars){
p <- ggplot(d, aes(x=channel,y=var)) +
geom_boxplot(aes(fill=label)) + ggtitle(var)
P <- c(P,p)
}
return(list(plots=P, num=length(vars)))
}
Run Code Online (Sandbox Code Playgroud)
我想要做的是使用上面的函数返回一个P由几个ggplots对象组成的连接列表,如下所示,这是'手动'版本正常工作:
p1 <- ggplot()+ ...
p2 <- ggplot()+ ...
p3 <- ggplot()+ ...
pdf('...')
grid.arrange(p1, p2, p3, nrow = 3)
dev.off()
Run Code Online (Sandbox Code Playgroud)
返回的目的num是在布局arg中用于后者.的grid.arrange功能.我有PLOTS返回变量:
PLOTS <- plotting(d)
pdf('...')
grid.arrange(PLOTS$plots, PLOTS$num)
dev.off()
Run Code Online (Sandbox Code Playgroud)
我收到了错误:
Error in arrangeGrob(..., as.table = as.table, clip = clip, main = main, :
input must be grobs!
Run Code Online (Sandbox Code Playgroud)
所以我尝试了将向量传递给grid.arrange作为参数列表的解决方案.
do.call(grid.arrange, c(PLOTS$plots, nrow = PLOTS$num))
Run Code Online (Sandbox Code Playgroud)
但仍然得到相同的错误.任何评论将不胜感激.
编辑:使问题描述更清晰,并粘贴d下面的可重现数据:
structure(list(percent = c(0.0962463533974437, 0.129409967469436,
0.0150265653130588, 0.00299276735619027, 0.0108596845008112,
0.00407417010800106), songs = c(0.231617443342384, 0.430320945945946,
0.109264389042782, 0.282109656611649, 0.0288753799392097, 0.041635687732342
), label = c("1", "1", "1", "1", "1", "1"), channel = c("2",
"2", "2", "2", "2", "2")), .Names = c("percent", "songs", "label",
"channel"), row.names = c(NA, 6L), class = "data.frame")
Run Code Online (Sandbox Code Playgroud)
请输入d参数plotting并继续PLOTS$plots帮我调试,谢谢!
你的绘图功能有一些问题.首先,您需要初始化P为list.其次,如果要使用输入,则需要使用aes_string而不是代替.然后你必须使用,以保持对象完好无损.aescharactervarlist(p)ggplot
plotting <- function(d){
P <- list()
vars <- names(d)[!names(d)%in%c('channel','label')]
for (var in vars){
p <- ggplot(d, aes_string(x='channel', y=var)) +
geom_boxplot(aes(fill=label)) + ggtitle(var)
P <- c(P, list(p))
}
return(list(plots=P, num=length(vars)))
}
PLOTS <- plotting(d)
do.call(grid.arrange, c(PLOTS$plots, nrow = PLOTS$num))
Run Code Online (Sandbox Code Playgroud)