2014-06-24 11 views
7

Vorrei tracciare due ggplot su una pagina. Ha preso l'esempio da Cookbook for R e non funziona. L'errore è could not find function "multiplot".Errore R "Impossibile trovare la funzione 'multiplot'" utilizzando l'esempio di Cookbook

Tuttavia i grafici sono tracciabili, inoltre ho reinstallato R, ggplot2, riavviato, ecc. Sto facendo qualcosa di sbagliato?

library(ggplot2) 

# This example uses the ChickWeight dataset, which comes with ggplot2 
# First plot 
p1 <- 
    ggplot(ChickWeight, aes(x=Time, y=weight, colour=Diet, group=Chick)) + 
    geom_line() + 
    ggtitle("Growth curve for individual chicks") 

# Second plot 
p2 <- 
    ggplot(ChickWeight, aes(x=Time, y=weight, colour=Diet)) + 
    geom_point(alpha=.3) + 
    geom_smooth(alpha=.2, size=1) + 
    ggtitle("Fitted growth curve per diet") 

# Third plot 
p3 <- 
    ggplot(subset(ChickWeight, Time==21), aes(x=weight, colour=Diet)) + 
    geom_density() + 
    ggtitle("Final weight, by diet") 

# Fourth plot 
p4 <- 
    ggplot(subset(ChickWeight, Time==21), aes(x=weight, fill=Diet)) + 
    geom_histogram(colour="black", binwidth=50) + 
    facet_grid(Diet ~ .) + 
    ggtitle("Final weight, by diet") + 
    theme(legend.position="none")  # No legend (redundant in this graph)  

multiplot(p1, p2, p3, p4, cols=2) 
+1

http://www.cookbook-r.com/Graphs/Multiple_graphs_on_one_page_%28ggplot2%29/ "Il modo semplice è utilizzare la funzione multiplot, definita nella parte inferiore di questa pagina." – jdharrison

+7

FWIW 'grid.arrange (p1, p2, p3, p4, ncol = 2)' potrebbe rivelarsi più conveniente poiché è incluso in un pacchetto (grigliaExtra). – baptiste

risposta

17

Citando dalla pagina si collega a:

Il modo più semplice è quello di utilizzare la funzione di multiplo, definita in fondo a questa pagina. Se non è adatto alle tue esigenze, puoi copiarlo e modificarlo.

E il codice è:

# Multiple plot function 
# 
# ggplot objects can be passed in ..., or to plotlist (as a list of ggplot objects) 
# - cols: Number of columns in layout 
# - layout: A matrix specifying the layout. If present, 'cols' is ignored. 
# 
# If the layout is something like matrix(c(1,2,3,3), nrow=2, byrow=TRUE), 
# then plot 1 will go in the upper left, 2 will go in the upper right, and 
# 3 will go all the way across the bottom. 
# 
multiplot <- function(..., plotlist=NULL, file, cols=1, layout=NULL) { 
    require(grid) 

    # Make a list from the ... arguments and plotlist 
    plots <- c(list(...), plotlist) 

    numPlots = length(plots) 

    # If layout is NULL, then use 'cols' to determine layout 
    if (is.null(layout)) { 
    # Make the panel 
    # ncol: Number of columns of plots 
    # nrow: Number of rows needed, calculated from # of cols 
    layout <- matrix(seq(1, cols * ceiling(numPlots/cols)), 
        ncol = cols, nrow = ceiling(numPlots/cols)) 
    } 

if (numPlots==1) { 
    print(plots[[1]]) 

    } else { 
    # Set up the page 
    grid.newpage() 
    pushViewport(viewport(layout = grid.layout(nrow(layout), ncol(layout)))) 

    # Make each plot, in the correct location 
    for (i in 1:numPlots) { 
     # Get the i,j matrix positions of the regions that contain this subplot 
     matchidx <- as.data.frame(which(layout == i, arr.ind = TRUE)) 

     print(plots[[i]], vp = viewport(layout.pos.row = matchidx$row, 
             layout.pos.col = matchidx$col)) 
    } 
    } 
} 
+0

Grazie :) Buona giornata! – alex

4

salvare questo script nella vostra directory locale e la fonte è sorgente ("..../multiplot.R") si sarà quindi in grado di creare più grafici

multiplot <- function(..., plotlist = NULL, file, cols = 1, layout = NULL) { 
    require(grid) 

    plots <- c(list(...), plotlist) 

    numPlots = length(plots) 

    if (is.null(layout)) { 
    layout <- matrix(seq(1, cols * ceiling(numPlots/cols)), 
       ncol = cols, nrow = ceiling(numPlots/cols)) 
} 

if (numPlots == 1) { 
print(plots[[1]]) 

} else { 
grid.newpage() 
pushViewport(viewport(layout = grid.layout(nrow(layout), ncol(layout)))) 

for (i in 1:numPlots) { 
    matchidx <- as.data.frame(which(layout == i, arr.ind = TRUE)) 

    print(plots[[i]], vp = viewport(layout.pos.row = matchidx$row, 
            layout.pos.col = matchidx$col)) 
} 
} 
} 
5

qualcuno era bello e mettere la funzione multiplo nel pacchetto Rmisc, così si potrebbe usare anche questo.

Problemi correlati