library(ggplot2)
df <- data.frame(x=1:10, y=rnorm(10))
p1 <- ggplot(df, aes(x,y)) + geom_point()
plist <- list(p1,p1,p1,p1,p1)
# In my real example,a plot function will fit a ggplot to a list of datasets
#and return a list of ggplots like the example above.
Я хочу оформить участки используя grid.arrange()
в gridExtra
.
Как я могу это сделать, если количество графиков plist
варьируется?
Это работает:
grid.arrange(plist[[1]],plist[[2]],plist[[3]],plist[[4]],plist[[5]])
но мне нужно более общее решение. мысли?
grid.arrange(plist[[1:length(plist)]], ncol = nCol))
Я получаю такую ошибку:Error in hl.plots[[1:12]] : no such index at level 3
Спасибо!x <- list(1,2); x[[3:1]]
. В более широком смысле, используйте что-то вроде,plist[...]
а неplist[[...]]
для подмножества. И затем используйтеdo.call()
, который мы должны использовать, потому чтоgrid.arrange()
он не настроен на использование списка в качестве первого аргумента. Ура и удачи!Вы можете использовать
grid.arrange()
иarrangeGrob()
со списками, если вы указываете список с помощьюgrobs =
аргумента в каждой функции. Например, в приведенном вами примере:library(ggplot2) library(gridExtra) df <- data.frame(x=1:10, y=rnorm(10)) p1 <- ggplot(df, aes(x,y)) + geom_point() plist <- list(p1,p1,p1,p1,p1) grid.arrange(grobs = plist, ncol = 2) ## display plot ggsave(file = OutFileName, arrangeGrob(grobs = plist, ncol = 2)) ## save plot
источник
Для полноты (и поскольку этот старый вопрос, на который уже был дан ответ , недавно был возрожден ), я хотел бы добавить решение с использованием
cowplot
пакета:cowplot::plot_grid(plotlist = plist, ncol = 2)
источник
Error in ggplot_to_gtable(x) : Argument needs to be of class "ggplot" or "gtable"
ggplot2
пакетную или базовую графику?ggplot2
.grid.arrange
у меня почти сработало - но, оказывается, мой список участков не заполняется. Я разместил проблему как вопрос: stackoverflow.com/questions/43216262/… . Итак, мне интересно, могло ли это быть проблемой и для коровьего заговораЯ знаю, что в вопросе конкретно говорится об использовании пакета gridExtra , но
wrap_plots
функция из пакета patchwork - отличный способ обрабатывать список переменной длины:library(ggplot2) # devtools::install_github("thomasp85/patchwork") library(patchwork) df <- data.frame(x=1:10, y=rnorm(10)) p1 <- ggplot(df, aes(x,y)) + geom_point() plist <- list(p1,p1,p1,p1,p1) wrap_plots(plist)
Полезно то, что вам не нужно указывать, сколько столбцов требуется, и вы будете стремиться к тому, чтобы количество столбцов и строк оставалось равным. Например:
plist <- list(p1,p1,p1,p1,p1,p1,p1,p1,p1,p1,p1,p1,p1) wrap_plots(plist) # produces a 4 col x 4 row plot
источник
devtools::install_github("thomasp85/patchwork")
?Чтобы уместить все графики на одной странице, вы можете рассчитать количество столбцов и строк следующим образом:
x = length(plots) cols = round(sqrt(x),0) rows = ceiling(x/cols)
Поскольку большинство функций построения графиков имеют аргументы ncol и nrow, вы можете просто вставить их туда. Мне нравится ggarrange от ggpubr.
Так будет больше строк, чем столбцов, поэтому поменяйте местами, если хотите наоборот. Т.е. для 6 графиков это даст 3 строки и 2 столбца, а не наоборот.
источник