Kombinowany Wykres ggplot2 (Nie w jednym wykresie), używając funkcji par() lub layout ()? [duplikat]

To pytanie ma już odpowiedź tutaj:

Myślałem o użyciu funkcji par() lub layout() do łączenia ggplotów. Czy będzie można korzystać z tych funkcji?

Powiedz, że chcę narysować ggplot dla scatterplot i ggplot dla histogramu. I chcę połączyć te dwie działki (Nie w POJEDYNCZA DZIAŁKA). Czy ma zastosowanie?

Próbowałem z prostym plotowaniem w R, bez użycia funkcji ggplot. I to działa.

Oto próbka z 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)

Ale kiedy próbuję użyć ggplot i połączyć fabułę, nie dostaję wyjścia.

Author: joran, 2012-02-29

3 answers

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))
 32
Author: Maiasaura,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-28 22:47:01

Narzędzie, które moim zdaniem zasługuje na większą uwagę, to layOut dawniej z pakietu TH wq (zwróć uwagę na duże "O"). Od tego czasu został usunięty z pakietu wq, więc umieściłem kod poniżej i zmieniłem jego nazwę na lay_out, aby pasował do typowego stylu ggplot. To jest jak base::layout w tym, że działki mogą być różnej wielkości, ułożone w rzędach i kolumnach. Każdy argument lay_out jest 3-elementową listą składającą się z wykresu, indeksów wierszy, w których ma być wykreślony, oraz indeksów kolumn, w których ma być wykreślony to.

Na przykład, używając wątków @ Paula Mcmurdiego,

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

Tutaj wpisz opis obrazka

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

(Kod pochodzi z wcześniejszej wersji pakietu wq, z historii zatwierdzeń na nieoficjalnym serwerze Mirror Github cran.)

 13
Author: Gregor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-27 23:55:22

Odpowiedź grid.layout działa, użyłem jej i zagłosowałem. Jednak zwykle uważam to rozwiązanie za zbyt żmudne i podatne na błędy i podejrzewam, że większość entuzjastów ggplot2, którzy robią to regularnie, zawinęła to w funkcję. Znalazłem kilka takich funkcji owijania w poprzednich wyszukiwaniach, ale moje obecne rozwiązanie workhorse znajduje się w pakiecie grid addon o nazwie gridExtra. Ma użyteczne argumenty, ale domyślna konfiguracja wierszy/kolumn jest często tym, co chciałeś w pierwszym miejsce:

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)

Zauważ, jak rzeczywisty kod "połącz moje wykresy w jedną grafikę" był jedną linią (po załadowaniu gridExtra). Można argumentować, że umieszczenie fabuły na liście było dodatkową linią, ale w rzeczywistości mogłem alternatywnie użyć

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

Dla małej liczby ggplotów może to być lepsze. Jednak dla n_plots > 4 zaczniesz mieć pretensje do nazwy i wpisania ich wszystkich.

 7
Author: Paul McMurdie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-29 22:58:10