Dzięki grid.arrange
mogę ułożyć wiele ggplot
figur w siatce, aby uzyskać figurę wielopanelową, używając czegoś takiego:
library(ggplot2)
library(grid)
library(gridExtra)
wygeneruj więc kilka wykresów ggplot2
plot5 <- grid.arrange(plot4, plot1, heights=c(3/4, 1/4), ncol=1, nrow=2)
Jak mogę uzyskać „niezrównoważony” układ 2-kolumnowy z jednym wykresem w całej pierwszej kolumnie i trzema wykresami w drugiej kolumnie? Bawiłem się podejściem „siatki sieci”, próbując grid.arrange
wykreślić jedną siatkę (np. plot5
Powyżej) z innym wykresem, ale uzyskałem:
Błąd w aranżacji Grob (..., as.table = as.table, clip = clip, main = main,: wejście musi być grobami!
Aktualizacja:
Dzięki za radę. Zajrzę do viewports
i grid
. W międzyczasie dzięki @DWin layOut
funkcja w pakiecie 'wq' działała bardzo dobrze na figurze kompilacji w moim Sweave
dokumencie:
Aktualizacja 2:
arrangeGrob
Poleceń (jak sugeruje @baptiste) również działa dobrze, i wydaje się bardzo intuicyjny - przynajmniej to było łatwe do zmiany szerokości dwóch kolumnach. Ma również tę zaletę, że nie wymaga pakietu `wq '.
np. Oto kod z mojego pliku Sweave:
<<label=fig5plot, echo=F, results=hide>>=
plot5<-grid.arrange(plot4, arrangeGrob(plot1, plot2, plot3, ncol=1),
ncol=2, widths=c(1,1.2))
@
\begin{figure}[]
\begin{center}
<<label=fig5,fig=TRUE,echo=T, width=10,height=12>>=
<<fig5plot>>
@
\end{center}
\caption{Combined plots using the `arrangeGrob' command.}
\label{fig:five}
\end{figure}
co daje następujący wynik:
BTW, ktoś mi powie, dlaczego pojawia się '> NA'?
grid.arrange
może nie być wystarczająco elastyczne (grid
. Zobacz także książkę Hadley o ggplot2, Rozdział 8.4.2.grid.arrange
może być używany z zagnieżdżonymi rzutniami przy użyciu jegoarrangeGrob
elementu towarzyszącego (zasadniczo zwracającego agTree
), jak w przykładzie, który podałem poniżej.plot5
nie jest wymagane, ponieważgrid.arrange
nic nie zwraca (NULL). Jeśli chcesz zapisać wynikowy grob, użyjarrangeGrob
ponownie (igrid.draw
wyświetl go).Odpowiedzi:
grid.arrange
rysuje bezpośrednio na urządzeniu; jeśli chcesz połączyć go z innymi potrzebnymi obiektami siatkiarrangeGrob
, jak wp = rectGrob() grid.arrange(p, arrangeGrob(p,p,p, heights=c(3/4, 1/4, 1/4), ncol=1), ncol=2)
Edycja (07/2015): przy v> 2.0.0 można użyć
layout_matrix
argumentu,grid.arrange(p,p,p,p, layout_matrix = cbind(c(1,1,1), c(2,3,4)))
źródło
cbind(c(1,1,1), c(2,3,4))
macierz opisuje rozmieszczenie figur?Próbowałem to rozgryźć za pomocą siatki i pomyślałem, że to źle, ale skończyło się niepowodzeniem (chociaż patrząc teraz na kod w funkcji, którą cytuję poniżej, widzę, że byłem naprawdę blisko ... :-)
Pakiet 'wq' ma
layOut
funkcję, która zrobi to za Ciebie:p1 <- qplot(mpg, wt, data=mtcars) layOut(list(p1, 1:3, 1), # takes three rows and the first column list(p1, 1, 2), # next three are on separate rows list(p1, 2,2), list(p1, 3,2))
źródło
g1
,g2
itp, aby być w całościp1
?Inną alternatywą jest
patchwork
pakiet autorstwa Thomasa Lin Pedersena.# install.packages("devtools") # devtools::install_github("thomasp85/patchwork") library(patchwork)
Wygeneruj kilka wykresów.
Teraz ułóż działki.
źródło
Istnieje również pakiet multipanelfigure że warto wspomnieć. Zobacz także tę odpowiedź .
library(ggplot2) theme_set(theme_bw()) q1 <- ggplot(mtcars) + geom_point(aes(mpg, disp)) q2 <- ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear)) q3 <- ggplot(mtcars) + geom_smooth(aes(disp, qsec)) q4 <- ggplot(mtcars) + geom_bar(aes(carb)) library(magrittr) library(multipanelfigure) figure1 <- multi_panel_figure(columns = 2, rows = 3, panel_label_type = "upper-roman") figure1 %<>% fill_panel(q1, column = 1, row = 1:3) %<>% fill_panel(q2, column = 2, row = 1) %<>% fill_panel(q3, column = 2, row = 2) %<>% fill_panel(q4, column = 2, row = 3) #> `geom_smooth()` using method = 'loess' and formula 'y ~ x' figure1
Utworzony 2018-07-16 przez pakiet reprex (v0.2.0.9000).
źródło