我想在带有grid.arrange的网格上排列N个ggplot(每个面都是多面的)。
library(tidyverse)
library(ggplot2)
library(gridExtra)
plots <- lapply(unique(mtcars$cyl), function(cyl) {
data <- mtcars %>% filter(cyl == cyl)
ggplot(data, aes(x=mpg, y=hp))+
geom_point(color = "blue")+
facet_wrap(.~carb)}) %>%
do.call(grid.arrange, .)
do.call(grid.arrange, plots )
问题在于所有图都基于整个数据集,并且它们呈现相同的图,而当我在行中对其进行过滤时,它们应该保持不同
data <- mtcars %>% filter(cyl == cyl)
。
答案 0 :(得分:6)
filter
处理cyl
过于字母化并且被视为字符串,因此cyl==cyl
对于整个数据集为TRUE。您可以通过使用!!
取消对cyl的引用或在函数中使用另一个变量名来解决此问题,例如x
。
#Option 1
data <- mtcars %>% filter(cyl == !!cyl)
#Option 2
... function(x) {
data <- mtcars %>% filter(cyl == x)
...
答案 1 :(得分:4)
这是一种tidyverse
的方法
library(tidyverse)
group_plots <- mtcars %>%
group_split(cyl) %>%
map(~ggplot(., aes(x = mpg, y = hp))+
geom_point(color = "blue") +
facet_wrap(.~carb))
do.call(gridExtra::grid.arrange, group_plots)
答案 2 :(得分:3)