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.
Chciałbym ułożyć działki używając grid.arrange()
w gridExtra
.
Jak mam to zrobić, jeśli liczba działek plist
jest zmienna?
To działa:
grid.arrange(plist[[1]],plist[[2]],plist[[3]],plist[[4]],plist[[5]])
ale potrzebuję bardziej ogólnego rozwiązania. myśli?
grid.arrange(plist[[1:length(plist)]], ncol = nCol))
Otrzymuję taki błąd:Error in hl.plots[[1:12]] : no such index at level 3
Dzięki!x <- list(1,2); x[[3:1]]
. Szerzej, użyjplist[...]
raczej czegoś podobnego niżplist[[...]]
wykonywania podzbiorów. A następnie użyjdo.call()
, którego musimy użyć, ponieważgrid.arrange()
nie jest skonfigurowany do przyjmowania listy jako pierwszego argumentu. Pozdrawiam i powodzenia!Możesz używać
grid.arrange()
izarrangeGrob()
listami, o ile określisz listę przy użyciugrobs =
argumentu w każdej funkcji. Np. W podanym przykładzie: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
źródło
Ze względu na kompletność (a ponieważ to stare pytanie, na które już udzielono odpowiedzi , zostało ostatnio przywrócone ) chciałbym dodać rozwiązanie wykorzystujące
cowplot
pakiet:cowplot::plot_grid(plotlist = plist, ncol = 2)
źródło
Error in ggplot_to_gtable(x) : Argument needs to be of class "ggplot" or "gtable"
ggplot2
pakietu lub grafiki bazowej?ggplot2
.grid.arrange
prawie zadziałało dla mnie - ale okazuje się, że moja lista działek się nie zapełnia. Opublikowałem ten problem jako pytanie: stackoverflow.com/questions/43216262/… . Zastanawiam się więc, czy to mógł być problem również dla cowplotWiem, że pytanie konkretnie określa użycie pakietu gridExtra , ale
wrap_plots
funkcja z pakietu patchwork to świetny sposób na obsługę listy o zmiennej długości: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)
Przydatną rzeczą jest to, że nie musisz określać, ile kolumn jest wymaganych, i będziesz dążyć do utrzymania równej liczby kolumn i wierszy. Na przykład:
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
źródło
devtools::install_github("thomasp85/patchwork")
?Aby zmieścić wszystkie wykresy na jednej stronie, możesz obliczyć liczbę kolumn i wierszy w następujący sposób:
x = length(plots) cols = round(sqrt(x),0) rows = ceiling(x/cols)
Ponieważ większość funkcji kreślących ma ncol i nrow jako argumenty, możesz je tam po prostu wstawić. Lubię ggarrange z ggpubr.
To faworyzuje więcej wierszy niż kolumn, więc odwróć, jeśli chcesz odwrotnie. To znaczy dla 6 poletek da to 3 rzędy i 2 kolumny, a nie na odwrót.
źródło