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

Комбинированный график ggplot2 (Не в одном графике), используя функцию par() или layout()?

Я думал об использовании функций par() или layout() для объединения ggplots. Можно ли использовать эти функции?

Скажем, я хочу построить ggplot для диаграммы рассеяния и ggplot для гистограммы. И я хочу объединить два участка (НЕ В ОДНОМ УЧАСТКЕ). Это применимо?

Я попробовал это с простым построением графика в R, не используя функции ggplot. И он работает на самом деле.

Здесь образец из Quick-R, Link: http://www.statmethods.net/advgraphs/layout.html

# 4 figures arranged in 2 rows and 2 columns
attach(mtcars)
par(mfrow=c(2,2))
plot(wt,mpg, main="Scatterplot of wt vs. mpg")
plot(wt,disp, main="Scatterplot of wt vs disp")
hist(wt, main="Histogram of wt")
boxplot(wt, main="Boxplot of wt")

# One figure in row 1 and two figures in row 2
attach(mtcars)
layout(matrix(c(1,1,2,3), 2, 2, byrow = TRUE))
hist(wt)
hist(mpg)
hist(disp)

Но когда я пытаюсь использовать ggplot и комбинировать график, я не получаю вывод.

4b9b3361

Ответ 1

library(ggplot2)
library(grid)


vplayout <- function(x, y) viewport(layout.pos.row = x, layout.pos.col = y)


plot1 <- qplot(mtcars,x=wt,y=mpg,geom="point",main="Scatterplot of wt vs. mpg")
plot2 <- qplot(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)

# 4 figures arranged in 2 rows and 2 columns
grid.newpage()
pushViewport(viewport(layout = grid.layout(2, 2)))
print(plot1, vp = vplayout(1, 1))
print(plot2, vp = vplayout(1, 2))
print(plot3, vp = vplayout(2, 1))
print(plot4, vp = vplayout(2, 2))


# One figure in row 1 and two figures in row 2
grid.newpage()
pushViewport(viewport(layout = grid.layout(2, 2)))
print(plot5, vp = vplayout(1, 1:2))
print(plot6, vp = vplayout(2, 1))
print(plot7, vp = vplayout(2, 2))

Ответ 2

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

Например, используя графики @Paul McMurdie,

lay_out(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

lay_out = function(...) {    
    x <- list(...)
    n <- max(sapply(x, function(x) max(x[[2]])))
    p <- max(sapply(x, function(x) max(x[[3]])))
    grid::pushViewport(grid::viewport(layout = grid::grid.layout(n, p)))    

    for (i in seq_len(length(x))) {
        print(x[[i]][[1]], vp = grid::viewport(layout.pos.row = x[[i]][[2]], 
            layout.pos.col = x[[i]][[3]]))
    }
} 

(Код, полученный из предыдущей версии пакета wq, из зафиксировать историю на неофициальном зеркале GITHUB CRAN.)

Ответ 3

Ответ с участием grid.layout работает, я использовал его, и я его проголосовал. Тем не менее, я обычно считаю, что это решение слишком утомительно и подвержено ошибкам, и я подозреваю, что большинство энтузиастов ggplot2, которые это делают, регулярно завершают эту функцию. Я обнаружил несколько таких функций обертывания в предыдущих поисковых запросах, но мое текущее решение рабочей лошадки находится в пакете grid addon, который называется gridExtra. Он имеет полезные аргументы, но настройка строк/столбцов по умолчанию часто является тем, что вы хотели в первую очередь:

library("ggplot2")
# Generate list of 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)
# You might have produced myPlotList using instead lapply, mc.lapply, plyr::dlply, etc 
myPlotList = list(plot1, plot2, plot3, plot4, plot5, plot6, plot7)
library("gridExtra")
do.call(grid.arrange,  myPlotList)

Обратите внимание, как фактический "комбинировать мои графики в один графический" код был одной строкой (после загрузки gridExtra). Вы можете утверждать, что включение графиков в список было дополнительной линией, но на самом деле я мог бы использовать альтернативный вариант

grid.arrange(plot1, plot2, plot3, plot4, plot5, plot6, plot7)

Для небольших номеров ggplots это может быть предпочтительнее. Тем не менее, для n_plots > 4 вы начнете возмущаться, чтобы назвать и набрать их все.