2015-05-18 13 views
6

Vorrei utilizzare lo stesso codice ggplot per produrre 8 figure diverse in base alle cifre nel mio dataframe. Solitamente userei facet_grid, ma in questo caso, vorrei finire con un pdf di ogni singola figura. Ad esempio, mi piacerebbe un pdf per ogni riga qui:Produci più figure ggplot all'interno di un ggplot()

df <- read.table(text = " 
xvalue  yvalue location planting crop 
    1   5   A   early  corn 
    2   3   A   late  corn 
    6   2   A   early  soy 
    7   4   A   late  soy 
    4   7   S   early  corn 
    2   6   S   late  corn 
    3   2   S   early  soy 
    5   1   S   late  soy 
", sep = "", header = TRUE) 

ggplot base:

library(ggplot2) 

ggplot()+ 
    geom_point(aes(x=xvalue, y=yvalue), data=df) 

ma invece di facet_grid per ottenere le combo posizione x semina x colture, voglio uno pdf separata ogni.

+3

Qualcosa [come questo] (http://stackoverflow.com/a/19147917/2461552)? – aosmith

risposta

1

Prima ho fatto il tuo MWE in un data.table perché è più veloce

library(data.table) 
library(ggplot2) 
library(gridExtra) 

df <- data.table(read.table(text = " 
      xvalue  yvalue location planting crop 
      1   5   A   early  corn 
      2   3   A   late  corn 
      6   2   A   early  soy 
      7   4   A   late  soy 
      4   7   S   early  corn 
      2   6   S   late  corn 
      3   2   S   early  soy 
      5   1   S   late  soy 
      ", sep = "", header = TRUE)) 

ho incollato insieme il vostro planting e corn informazioni per creare una colonna separata:

df[ , plantingCrop := paste(df$planting, df$crop, sep = "-") ] 

ho creato un vettore di carattere che ha tutte le combinazioni di planting e crop. Capirete perché in un secondo:

plantingCrop1 <- unique(df$plantingCrop) 

Io uso gridExtra per creare tutti i lotti in separato .pdf pagine. Fondamentalmente ho creato un ciclo che traccia tanti grafici quanti sono i caratteri nell'oggetto plantingCrop1 che ho creato sopra.In ogni ciclo, dat è il gruppo di sottoseti che si desidera tracciare, dal gruppo unico plantingCrop da quando abbiamo incollato le colonne planting e crop insieme. Ripete questo finché non è stato fatto tutto.

pdf("plantingCrop.pdf", onefile = TRUE) 
for(i in 1:length(plantingCrop1)){ 
     dat <- subset(df, plantingCrop==plantingCrop1[i]) 
     cropPlot <- ggplot(dat, aes(xvalue,yvalue)) + 
        geom_boxplot(aes(color = location)) + 
        theme_bw() + 
        ggtitle(bquote(atop(.("Boxplot of Stuff"), 
          atop(italic(.(plantingCrop1[i])), "")))) + 
        labs(x = "xvalue", y = "yvalue") + 
        theme(legend.position = "top", legend.title=element_blank()) 
     grid.arrange(cropPlot) 
     } 
dev.off() 

Ho incluso anche il modo giusto per nominare i file utilizzando il nome plantingCrop come sottotitolo. È nella chiamata ggtitle.

Ti incoraggio a cambiare geom_boxplot(aes(color = location)) a geom_boxplot(aes(fill = location) quando hai più dati mentre vengono visualizzati su un grafico migliore, ma per il momento l'ho lasciato in questo modo in modo da poter vedere i diversi gruppi.

0

Ecco un altro approccio:

library(plyr) 
library(ggplot2) 

df <- read.table(text = " 
xvalue  yvalue location planting crop 
    1   5   A   early  corn 
    2   3   A   late  corn 
    6   2   A   early  soy 
    7   4   A   late  soy 
    4   7   S   early  corn 
    2   6   S   late  corn 
    3   2   S   early  soy 
    5   1   S   late  soy 
", sep = "", header = TRUE) 

fplot <- function(d) 
    { 
    require(ggplot2) 
    p <- ggplot(d, aes(x = xvalue, y = yvalue)) + 
      geom_point(size = 4) + 
      xlim(0, 10) + ylim(0, 10) 
    file <- with(d, paste0(paste(planting, crop, location, sep = "_"), ".pdf")) 
    ggsave(file, p) 
    } 

d_ply(df, ~ rownames(df), fplot) 

il nome del file assomigliano early_corn_A.pdf e vengono salvati nella directory di lavoro corrente. Ho impostato i limiti x/y fissi per comodità visiva. La funzione accetta un frame di dati su una riga come input e genera un grafico in formato PDF. La funzione plyr::d_ply() elabora ciascuna riga del frame di dati e produce un grafico separato per riga.

0

Mi sono imbattuto in un problema simile.

ho semplicemente usato

gridExtra()

Disponibile here

Poi, ho usato un altro pacchetto di nome:

cowplot()

Disponibile here

Poi ho seguito i passaggi here.

E ha funzionato come un fascino. : D

Spero che aiuti.