2014-06-24 11 views
7

Chciałbyś narysować dwa ggplots na jednej stronie. Wziął przykład z Cookbook for R i nie działa. Błąd to could not find function "multiplot".Błąd R "nie mógł znaleźć funkcji 'mnożnik'" za pomocą przykładu z książki kucharskiej

Jednak ggplots są możliwe do zarzucenia, również ja ponownie zainstalowałem R, ggplot2, zrestartowałem, itd .. Czy robię coś nie tak?

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/ "Łatwym sposobem jest użycie funkcji multiplot, zdefiniowanej na dole tej strony." – jdharrison

+7

FWIW 'grid.arrange (p1, p2, p3, p4, ncol = 2)' może okazać się wygodniejsze, ponieważ jest zawarte w pakiecie (gridExtra). – baptiste

Odpowiedz

17

Cytując ze strony, link do:

w prosty sposób to użycie funkcji multiplot, zdefiniowanego na dole tej strony. Jeśli nie jest odpowiedni do twoich potrzeb, możesz go skopiować i zmodyfikować.

I kod to:

# 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

Dziękuję :) Miłego dnia! – alex

4

zapisać ten skrypt w lokalnym katalogu i źródła, źródła ("..../multiplot.R") będzie wtedy w stanie stworzyć wielokrotne Działki

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

Ktoś był miły i umieścić funkcję multiplot w pakiecie Rmisc, więc można używać, too.

Powiązane problemy