Создание произвольных окон в ggplot2

В базовой графике я могу создать панель с 4 панелями графики, выполнив следующие действия:

par(mfrow=c(2,2)) for (i in 1:4){ plot(density(rnorm(100))) } 

что приводит к

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

Я бы хотел сделать то же самое с ggplot2, но я не могу понять, как это сделать. Я не могу использовать грани, потому что мои реальные данные, в отличие от этого тривиального примера, находятся в очень разных структурах, и я хочу, чтобы два графика были диаграммами точек, а два – гистограммами. Как создавать панели или панели в ggplot2?

5 Solutions collect form web for “Создание произвольных окон в ggplot2”

Пример Josh O’Brien: я удивлен, что никто не упомянул grid.arrange из пакета gridExtra :

 library(gridExtra) grid.arrange(q1,q2,q3,q4,q5,q6,nrow=3) 

Это, как представляется, упоминается здесь: несколько графиков в одном canvasе с использованием ggplot2

Для меня это намного проще, чем запомнить все материалы в видовом экране.

EDIT: {Бен Болкер указывает на еще лучший вариант – grid.arrange из пакета gridExtra . Однако, если вы пользователь ggplot2 , сайт R Cookbook по-прежнему стоит щелчок. }

На этой странице R Cookbook есть код для хорошей multiplot функции (безусловно, стоит посетить), которая полезна для такого рода вещей. Цитирование непосредственно с этого сайта:

 multiplot < - function(..., plotlist=NULL, cols) { require(grid) # Make a list from the ... arguments and plotlist plots <- c(list(...), plotlist) numPlots = length(plots) # Make the panel plotCols = cols # Number of columns of plots plotRows = ceiling(numPlots/plotCols) # Number of rows needed, calculated from # of cols # Set up the page grid.newpage() pushViewport(viewport(layout = grid.layout(plotRows, plotCols))) vplayout <- function(x, y) viewport(layout.pos.row = x, layout.pos.col = y) # Make each plot, in the correct location for (i in 1:numPlots) { curRow = ceiling(i/plotCols) curCol = (i-1) %% plotCols + 1 print(plots[[i]], vp = vplayout(curRow, curCol )) } } 

Попытка с 6 сюжетами в макетах 3 на 2 (четыре из сюжетов JD Long и два бонусных!):

 set.seed(2) q1 < - ggplot(data.frame(x=rnorm(50)), aes(x)) + geom_density() q2 <- ggplot(data.frame(x=rnorm(50)), aes(x)) + geom_density() q3 <- ggplot(data.frame(x=rnorm(50)), aes(x)) + geom_density() q4 <- ggplot(data.frame(x=rnorm(50)), aes(x)) + geom_density() q5 <- ggplot(data.frame(x=rnorm(50)), aes(x)) + geom_density() q6 <- ggplot(data.frame(x=rnorm(50)), aes(x)) + geom_density() multiplot(q1, q2, q3, q4, q5, q6, cols=2) 

дает следующую цифру:

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

Если функция не соответствует вашим потребностям, по крайней мере, она дает вам хорошую отправную точку!

Благодаря комментариям Andrie и ответам Harlan на мой предыдущий вопрос (!), Я взломал это решение, которое выполняет то, что я сделал после:

 set.seed(2) q1 < - ggplot(data.frame(x=rnorm(50)), aes(x)) + geom_density() q2 <- ggplot(data.frame(x=rnorm(50)), aes(x)) + geom_density() q3 <- ggplot(data.frame(x=rnorm(50)), aes(x)) + geom_density() q4 <- ggplot(data.frame(x=rnorm(50)), aes(x)) + geom_density() grid.newpage() pushViewport(viewport(layout=grid.layout(2,2))) vplayout <- function(x,y) viewport(layout.pos.row=x,layout.pos.col=y) print(q1,vp=vplayout(1,1)) print(q2,vp=vplayout(1,2)) print(q3,vp=vplayout(2,1)) print(q4,vp=vplayout(2,2)) 

который дает:

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

Утилита, я думаю, заслуживает большего внимания, поскольку это wq::layOut (обратите внимание на капитал «O»). Это похоже на base::layout поскольку графики могут иметь разный размер, выложенный в строках и столбцах. Каждый аргумент layOut представляет собой 3-элементный список, состоящий из графика, индексов строк для его построения и индексов столбцов для его построения. Например:

 library("ggplot2") # Generate arbitrary ggplots plot1 < - qplot(data = mtcars, x=wt, y=mpg, geom="point",main="Scatterplot of wt vs. mpg") plot2 <- qplot(data = mtcars, x=wt, y=disp, geom="point",main="Scatterplot of wt vs disp") plot3 <- qplot(wt,data=mtcars) plot4 <- qplot(wt,mpg,data=mtcars,geom="boxplot") plot5 <- qplot(wt,data=mtcars) plot6 <- qplot(mpg,data=mtcars) plot7 <- qplot(disp,data=mtcars) wq::layOut(list(plot1, 1, 1), list(plot2, 1, 2), list(plot3, 2, 1), list(plot4, 2, 2), list(plot5, 3, 1:2), list(plot6, 4, 1:2), list(plot7, 1:2, 3)) 

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

По состоянию на июль 2018 года существует несколько пакетов, которые помогают создавать многопанельные графики. См. Примеры ниже

 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(grid) library(egg) ggarrange(q1, q2, q3, q4, ncol = 2, top = "Plot title", bottom = textGrob( "This footnote is right-justified", gp = gpar(fontface = 3, fontsize = 10), hjust = 1, x = 1) ) #> `geom_smooth()` using method = 'loess' and formula 'y ~ x' 

пакет cowplot

 library(cowplot) plot_grid(q1, q2, q3, q4, ncol = 2, labels = "AUTO") #> `geom_smooth()` using method = 'loess' and formula 'y ~ x' 

пакет пэчворка

 library(patchwork) q1 + q2 + q3 + q4 + plot_layout(ncol = 2) + plot_annotation(title = "Plot title", subtitle = "Plot subtitle", tag_levels = 'A', tag_suffix = ')') #> `geom_smooth()` using method = 'loess' and formula 'y ~ x' 

 # complex layout 1 q1 + { q2 + plot_spacer() + { q3 + q4 + plot_layout(ncol = 1) } } + plot_layout(ncol = 1) #> `geom_smooth()` using method = 'loess' and formula 'y ~ x' 

 # complex layout 2 (q1 | q2 | q3) / q4 #> `geom_smooth()` using method = 'loess' and formula 'y ~ x' 

 # bonus: working with grob objects p1 < - ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear)) table1 <- tableGrob(mtcars[1:6, 1:4]) patchwork::wrap_plots(list(p1, table1), nrow = 1) 

пакет multipanelfigure

 library(magrittr) library(multipanelfigure) figure1 < - multi_panel_figure(columns = 2, rows = 2, panel_label_type = "none") # show the layout figure1 

 figure1 %<>% fill_panel(q1, column = 1, row = 1) %<>% fill_panel(q2, column = 2, row = 1) %<>% fill_panel(q3, column = 1, row = 2) %<>% fill_panel(q4, column = 2, row = 2) #> `geom_smooth()` using method = 'loess' and formula 'y ~ x' figure1 

 # complex layout figure2 < - multi_panel_figure(columns = 3, rows = 3, panel_label_type = "upper-roman") figure2 %<>% fill_panel(q1, column = 1:2, row = 1) %<>% fill_panel(q2, column = 3, row = 1) %<>% fill_panel(q3, column = 1, row = 2) %<>% fill_panel(q4, column = 2:3, row = 2:3) #> `geom_smooth()` using method = 'loess' and formula 'y ~ x' figure2 

Создано в 2018-07-06 пакетом reprex (v0.2.0.9000).

  • Объедините неравные данные и замените отсутствующие строки на 0
  • Вставить несколько столбцов вместе
  • Как удалить все пробелы из строки?
  • Как читать файл csv в R, где некоторые значения содержат символ процента (%)
  • Преобразование NA в факторный уровень
  • Эффективный способ rbind data.frames с разными столбцами
  • Могу ли я использовать список как hash в R? Если да, то почему это так медленно?
  • Подключение к SQL Server RODBC
  • ggplot2: изменение порядка стеков на гистограмме
  • Графики Ганта с R
  • Как объединить два файла RMarkdown (.Rmd) в один вывод?
  • Interesting Posts

    Перейдите к другому EditText, когда Soft Keyboard Next будет нажата на Android

    Установка значений по умолчанию для столбцов в JPA

    Можем ли мы написать собственный iterator в Java?

    Почему значок конверта панели задач Outlook иногда остается активным, даже если у меня нет непрочитанного письма?

    Visual Studio действует странно. Как это исправить?

    Как исправить раскладку клавиатуры на каждом компьютере Windows 10?

    Как определить, работает ли браузер Chrome с помощью jQuery?

    Могу ли я настроить таргетинг на: перед или: после псевдоэлемента с помощью сочетания братьев и сестер?

    Простой способ сравнения процессоров

    Как установить значок угла в верхнем углу изображения изображения профиля Google для Chrome на Ubuntu Linux?

    Переустановите два старых диска из raid0 setup для восстановления данных

    Как получить токен доступа после входа пользователя из Gmail в Android?

    Печать экрана с курсором в Windows 7

    В чем разница между ApplicationContext и WebApplicationContext в Spring MVC?

    Проверьте, находится ли массив внутри списка в lisp

    Давайте будем гением компьютера.