用循环中的空白填充ggplot facet面板

时间:2017-08-25 15:02:13

标签: r ggplot2

lots questions关于如何使用循环在网格中排列ggplots。但是,我不能把我所追求的东西拼凑在一起。

我想在循环中绘制任意数量的大小相等的图。至关重要的是,我想使用facet_wrap并将数据拆分成组(解释原因如下)。这是一个例子:

df <- mtcars
df$car <- rownames(df)

ucar <- unique(df$car)

# Split data into groups of n (6's here)
split6s <- split(ucar, ceiling(seq_along(ucar)/6))

p <- list()

# For each group of 6, plot something (mpg vs wt) faceted by group (car)
for(i in 1 :length(split6s)){
  # Subset for group
  temp <- subset(df, car %in% split6s[[i]])    

    # Save plot forcing facet with 1 row
    p[[i]] <- ggplot(temp, aes(mpg, wt)) + geom_point() + 
                facet_wrap(~car, nrow = 1)
}

p[[5]]

enter image description here

p[[6]]

enter image description here

所需p[[6]]

enter image description here

我想这样做,以便我可以在rmarkdown中标准化某些图表的大小,但是使用facets而不是仅仅将各个图表拼凑在一起。

1 个答案:

答案 0 :(得分:1)

我不确定这是否是您正在寻找的解决方案。

library(ggplot2)
library(grid)

df <- mtcars
df$car <- rownames(df)
ucar <- unique(df$car)
split6s <- split(ucar, ceiling(seq_along(ucar)/6))

p <- list()
for(i in 1 :length(split6s)){
  temp <- subset(df, car %in% split6s[[i]])    
  p[[i]] <- ggplot(temp, aes(mpg, wt)) + geom_point() + 
                facet_wrap(~car, nrow = 1)
}

g5 <- ggplotGrob(p[[5]])
g6 <- ggplotGrob(p[[6]])

# Delete left panels     
for (k in c(4:7, 16:19, 34:37)) {
  g5$grobs[[k]] <- nullGrob()
}
# Copy Maserati and Volvo panels
g5$grobs[[2]] <-  g6$grobs[[2]]
g5$grobs[[3]] <-  g6$grobs[[3]]
g5$grobs[[14]] <-  g6$grobs[[6]]
g5$grobs[[15]] <-  g6$grobs[[7]]
g5$grobs[[32]] <-  g6$grobs[[12]]
g5$grobs[[33]] <-  g6$grobs[[13]]
# Move left x-axis label
g5$grobs[[39]]$children[[1]]$x <- unit(1/6, "npc")

grid.draw(g5)

enter image description here