Подтвердить что ты не робот

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

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

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

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

enter image description here

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

4b9b3361

Ответ 1

Следующий пример Джоша О'Брайена: я удивлен, что никто еще не упомянул grid.arrange из пакета gridExtra:

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

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

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

Ответ 2

РЕДАКТИРОВАТЬ: { Бен Боллер указывает на еще лучший вариант - grid.arrange из пакета gridExtra. Если вы ggplot2 пользователь, тем не менее, R Cookbook по-прежнему стоит щелчок. }

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

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)

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

enter image description here

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

Ответ 3

Спасибо Андри и Харлан ответил на мой предыдущий вопрос (!), я взломал это решение, которое выполняет то, что я делал после:

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

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

enter image description here

Ответ 4

Утилита, которая, я думаю, заслуживает большего внимания, это 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))

enter image description here

Ответ 5

По состоянию на июль 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).