Graphique combiné de ggplot2 (pas dans un seul graphique), en utilisant la fonction par () ou layout ()? [dupliquer]

cette question a déjà une réponse ici:

j'ai pensé à utiliser les fonctions par() ou layout() pour combiner les ggplots. Il sera possible d'utiliser ces fonctions?

dis que je veux comploter ggplot pour scatterplot et ggplot pour histogramme. Et je veux combiner les deux parcelles (pas dans une seule). Est-elle applicable?

Je l'ai essayé avec le tracé simple dans R, sans utiliser les fonctions ggplot. Et il fonctionne réellement.

voici un échantillon de 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)

mais quand j'essaie d'utiliser ggplot, et de combiner l'intrigue, Je ne reçois pas un sortie.

24
demandé sur joran 2012-02-29 02:05:10

3 réponses

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
répondu Maiasaura 2012-02-28 22:47:01

un utilitaire qui mérite, je pense, plus d'attention car il s'agit du layOut anciennement du paquet wq (notez la majuscule"O"). Il a depuis été retiré du paquet wq , donc j'ai mis le code ci-dessous et l'ai renommé lay_out pour correspondre au style ggplot typique. C'est comme base::layout en ce que les parcelles peuvent être de différentes tailles, disposées en rangées et en colonnes. Chaque argument à lay_out est une liste de 3 éléments consistant de la parcelle, les indices de ligne dans laquelle tracer il, et les indices de colonne dans laquelle le tracer.

par exemple, en utilisant les parcelles de @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]]))
    }
} 

(Code provenant d'une version antérieure du paquet wq , du commit history on the unofficial Github CRAN mirror .)

13
répondu Gregor 2015-05-27 23:55:22

la réponse concernant grid.layout fonctionne, je l'ai utilisé, et je l'ai voté. Cependant, je trouve généralement cette solution beaucoup trop fastidieuse et sujette aux erreurs, et je soupçonne la plupart des passionnés de ggplot2 qui font cela ont régulièrement enveloppé cette fonction. J'ai trouvé plusieurs fonctions d'enrubannage de ce type dans des recherches précédentes, mais ma solution actuelle de cheval de travail est dans un paquet d'addon appelé gridExtra . Il a des arguments utiles, mais la configuration des lignes/colonnes par défaut est souvent ce que vous vouliez en premier lieu:

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)

remarquez comment le code "combinez mes tracés en un graphique" était une ligne (après chargement gridExtra). Vous pourriez soutenir que mettre les parcelles dans une liste était une ligne supplémentaire, mais en fait j'aurais pu alternativement utilisé

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

pour un petit nombre de ggplots cela pourrait être préférable. Cependant, pour n_plots > 4 vous commencerez à en vouloir d'avoir à les nommer et les dactylographier tous.

7
répondu Paul McMurdie 2014-09-29 22:58:10