Як я можу отримати `` незбалансовану '' сітку ggplots?


94

За допомогою grid.arrangeя можу впорядкувати декілька ggplotфігур у сітці, щоб досягти багатопанельної фігури, використовуючи щось на зразок:

library(ggplot2)
library(grid)
library(gridExtra)

потім згенеруйте кілька графіків ggplot2

plot5 <- grid.arrange(plot4, plot1, heights=c(3/4, 1/4), ncol=1, nrow=2)

Як я можу отримати `` незбалансований '' макет 2-х колонок з одним графіком у всьому першому кольорі та трьома графіками у другому кольорі? Я грався з підходом "сітки сіток", намагаючись використати grid.arrangeдля побудови однієї сітки (наприклад plot5, вище) проти іншої ділянки, але отримав:

Помилка в submitGrob (..., as.table = as.table, clip = clip, main = main,: введення має бути grobs!

Оновлення:

Дякую за пораду. Я розгляну viewportsі grid. Тим часом, завдяки @DWin, layOutфункція в пакеті 'wq' дуже добре працювала для рисунку компіляції в моєму Sweaveдокументі: введіть тут опис зображення

Оновлення 2:

arrangeGrobКоманда (як це було запропоновано @baptiste) також добре працює, і , здається , дуже інтуїтивний - принаймні , це було легко альтер ширин двох колонок. Він також має ту перевагу, що не вимагає пакета `wq '.

наприклад, ось код з мого файлу 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}

який дає такий результат: введіть тут опис зображення

До речі, хто-небудь скаже мені, чому з'являється '> NA'?


Можливо, вам доведеться налаштувати вікна перегляду самостійно - grid.arrangeможливо, недостатньо гнучко (шукайте stackoverflow для "[r] сітки перегляду")
Бен Болкер,

2
@BenBolker вказав вам у плідному напрямку grid. Див. Також книгу Хадлі ggplot2, розділ 8.4.2.
Арі Б. Фрідман

1
@BenBolker grid.arrangeможна використовувати з вкладеними вікнами перегляду, використовуючи його супутник arrangeGrob(по суті, повертаючи a gTree), як у прикладі, який я навів нижче.
баптист

1
остаточне призначення plot5не потрібно, оскільки grid.arrangeнічого не повертає (NULL). Якщо ви хочете зберегти отриманий grob, використовуйте arrangeGrobще раз (і grid.drawвідобразити його).
баптист

Відповіді:


73

grid.arrangeмалює безпосередньо на приладі; якщо ви хочете поєднати його з іншими потрібними вам об'єктами сітки arrangeGrob, як у

 p = rectGrob()
 grid.arrange(p, arrangeGrob(p,p,p, heights=c(3/4, 1/4, 1/4), ncol=1),
              ncol=2)

Редагувати (07/2015): при v> 2.0.0 ви можете використовувати layout_matrixаргумент,

 grid.arrange(p,p,p,p, layout_matrix = cbind(c(1,1,1), c(2,3,4)))

6
Чи можете ви пояснити, як cbind(c(1,1,1), c(2,3,4))матриця описує розташування фігур?
Рон Гейман,

5
@RonGejman це легко, якщо ви надрукуєте матрицю 3x2 на екрані: перший стовпець - це всі 1, там живе перший сюжет, що охоплює три рядки; друга колонка містить ділянки 2, 3, 4, кожна займає один рядок.
баптист

17

Я спробував зрозуміти це за допомогою сітки і думав, що у мене це не працює, але в підсумку не вдалося (хоча, дивлячись зараз на код у функції, яку я цитую нижче, я бачу, що я був дуже близький ... :-)

Пакет 'wq' має layOutфункцію, яка зробить це за вас:

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))

введіть тут опис зображення


Ого, це корисна функція! Я думаю, що copy + paste, можливо, вам не вдалося; Ви мали в виду для g1, g2і т.д. , щоб бути все p1?
Джоран

3
@joran: Я робив. Я не можу згадати, яка з "трьох чеснот програмування" є Лінь, але я знаю, що це десь є.
IRTFM

Дякую! Працювали дуже гарно. Дивись вище.
user441706

2

Інша альтернатива - patchworkпакет Томаса Ліна Педерсена.

# install.packages("devtools")
# devtools::install_github("thomasp85/patchwork")
library(patchwork)

Сформуйте кілька сюжетів.

p1 <- ggplot(mtcars) + geom_point(aes(mpg, disp)) + facet_grid(rows = vars(gear))
p2 <- ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear))
p3 <- ggplot(mtcars) + geom_smooth(aes(disp, qsec))
p4 <- ggplot(mtcars) + geom_bar(aes(carb))

Тепер упорядкуйте ділянки.

p1 + (p2 / p3 / p4)

введіть тут опис зображення


1

Існує також багатопанельний фігурний пакет, про який варто згадати. Дивіться також цю відповідь .

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

Створено 16.07.2018 пакетом reprex (v0.2.0.9000).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.