Tracé combiné de GGPLOT2 (pas dans un seul tracé), en utilisant la fonction par () ou la mise en page ()? [dupliquer

StackOverflow https://stackoverflow.com/questions/9490482

  •  14-11-2019
  •  | 
  •  

Question

J'ai pensé à utiliser des fonctions par () ou disposition () pour combiner ggplots. Sera-t-il possible d'utiliser ces fonctions?

Disons que je veux tracer GGPLOT pour Satterplot et GGPLOT pour l'histogramme. Et je veux combiner les deux parcelles (pas dans un seul tracé). Est-il applicable?

Je l'ai essayé avec un traçage simple dans R, sans utiliser les fonctions GGPLOT. Et ça marche en fait.

Voici un échantillon de Quick-R, lien: 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 lorsque j'essaie d'utiliser GGPLOT et de combiner l'intrigue, je n'obtiens pas de sortie.

Était-ce utile?

La solution

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

Autres conseils

Un utilitaire qui, je pense, mérite plus d'attention pour cela layOut anciennement de th wq package (notez la capitale "O"). Il a depuis été supprimé du wq package, j'ai donc mis le code ci-dessous et je l'ai renommé lay_out Pour correspondre au style GGPLOT typique. C'est comme base::layout en ce que les parcelles peuvent être de tailles variables, disposées en rangées et colonnes. Chaque argument de lay_out est une liste à 3 éléments composée du tracé, des indices de ligne dans lesquels le tracer et des indices de colonne dans lesquels le tracer.

Par exemple, en utilisant les intrigues 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 wq package, à partir du commettre une histoire sur le miroir non officiel de Github Cran.)

La réponse impliquant 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 que la plupart des amateurs de GGPLOT2 qui le font régulièrement l'ont enveloppé dans une fonction. J'ai trouvé plusieurs de ces fonctions d'emballage dans les recherches précédentes, mais ma solution actuelle de cheval de bataille est dans un Package d'addition de grille appelée gridExtra. Il a des arguments utiles, mais la configuration par défaut des lignes / colonnes 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 réel "combiner mes parcelles en un seul" code graphique était une ligne (après avoir chargé Gridextra). Vous pourriez affirmer que mettre les parcelles dans une liste était une ligne supplémentaire, mais en fait, j'aurais pu utiliser alternativement

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 à ressentir de devoir les nommer et les taper tous.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top