有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]]
p[[6]]
所需p[[6]]
我想这样做,以便我可以在rmarkdown
中标准化某些图表的大小,但是使用facets而不是仅仅将各个图表拼凑在一起。
答案 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)