grid.arrange

时间:2017-02-08 21:26:43

标签: r plot ggplot2 knitr do.call

我正在尝试绘制任意数量的条形图,其中rmarkdown由2列分隔。在我的例子中,将有20个总图,所以我希望在每列中得到10个图,但是,我似乎无法使用grid.arrange

plot.categoric = function(df, feature){
  df = data.frame(x=df[,feature])
  plot.feature = ggplot(df, aes(x=x, fill = x)) + 
    geom_bar() +
    geom_text(aes(label=scales::percent(..count../1460)), stat='count', vjust=-.4) +
    labs(x=feature, fill=feature) +
    ggtitle(paste0(length(df$x))) +
    theme_minimal()
  return(plot.feature)
}


plist = list()
for (i in 1:20){
  plist = c(plist, list(plot.categoric(train, cat_features[i])))
}

args.list = c(plist, list(ncol=2))
do.call("grid.arrange", args.list)

当我把它编织成html时,我得到以下输出:

enter image description here

我希望我能得到以下内容:

enter image description here

但即便如此,数字尺寸仍然很时髦,我尝试使用heightswidths,但仍然没有运气。如果这是一个很长的问题,请道歉

1 个答案:

答案 0 :(得分:1)

如果列表中包含所有ggplot个对象,则可以通过gridExtra::grid.arrange轻松构建两个列图形。这是一个简单的例子,它将8个图形放入4x2矩阵中。

library(ggplot2)
library(gridExtra)

# Build a set of plots
plots <-
  lapply(unique(diamonds$clarity),
         function(cl) {
           ggplot(subset(diamonds, clarity %in% cl)) +
           aes(x = carat, y = price, color = color) +
           geom_point()
         })

length(plots)
# [1] 8

grid.arrange(grobs = plots, ncol = 2)

enter image description here