2014-04-10 16 views
17

Ho cercato una soluzione a questo problema, ma sembra che la maggior parte si occupi di grafici generati individualmente che vengono combinati in formato PDF, piuttosto che separare i grafici generati usando la sfaccettatura su pagine separate di un PDF .Segmenta facet_wrap in PDF multipagina

Example Data

Nei dati di cui sopra utilizzando il seguente codice, selezionando tutti gli elementi della lista generata:

Ex<-read.csv("StackOverflowEx (3).csv") 
library(ggplot2) 
library(reshape2) 
vars <- select.list(names(Ex),multiple=TRUE,graphics=TRUE) 
Cases<-subset(Ex,select=vars) 

gg<-melt(Cases,id=c("Item","Total","Admin")) 
print(ggplot(gg, aes(x=Total,y=Admin))+ 
    geom_point(colour="dark green",size=1.5)+ 
    geom_point(aes(y=value,color=variable))+ 
    geom_smooth(aes(y=value,fill=variable), 
       method=loess,size=1,linetype=1,se=T)+ 
    facet_wrap(~variable,ncol=2,nrow=1000)+ 
    ylim(0,1)+ 
    labs(x="Expected",y="Admin",title=vars)) 

... dovrebbe generare un involucro aspetto di tutti gli 8 (A-H) casi. Tuttavia, la generazione di questo tende a ridurre i grafici e renderli meno leggibili, e in pratica, intendo utilizzarlo su oltre 500 casi (che restituiscono solo le barre etichettate con il nome della colonna senza grafici leggibili).

È possibile specificare il numero di grafici nella sfaccettatura da visualizzare su una singola pagina quando si converte in PDF, piuttosto che comprimere tutti i grafici in una singola pagina? Ad esempio, utilizzando i dati di cui sopra, generando due grafici 2x2 su pagine separate che contengono tutti e 8 i casi individualmente (ad esempio Casi A-D su pg 1, Casi E-H su pg 2).

Potrei farlo evidenziando 4 casi + "Elemento", "Totale" & "Amministratore" e ripetendo per i prossimi 4 casi e combinando i PDF risultanti. Tuttavia con 500 casi al rialzo nella pratica ciò significherebbe più di 100 iterazioni con un sacco di potenziale per errore umano. Qualche aiuto per automatizzare il processo sarebbe grandioso.

+0

se si cerca 'marrangeGrob' si potrebbe trovare un paio di idee, per esempio [qui] (http://stackoverflow.com/q/16809488/471093) – baptiste

+1

Hadley ha suggerito l'intervento manuale [nel 2011] (http://osdir.com/ml/ggplot2/2011-06/msg00248.html). Cercherò di capire che cosa fa # facets/pg e poi a sandwichare il ciclo o "applicare" su quel 'n' tra le chiamate' pdf (...) 'e' dev.off() ' – hrbrmstr

+1

Vorrei fare un ciclo su 500 variabili in gruppi di 4 o 5 e quindi generare un grafico per ciascuno, scaricando tutto in pdf. Di recente ho fatto qualcosa di simile dove ho usato un ciclo per generare 4 grafici per pagina e grid.arrange per tracciare 4 in ogni pagina pdf – user1617979

risposta

7

Come non c'è ancora risposta. Qui è uno:

library(ggplot2) 
library(reshape2) 

Ex <- read.csv("C:/Users/Thomas/Desktop/StackOverflowEx (3).csv") 
gg <- melt(Ex, id = c("Item", "Total", "Admin")) 

# put in number of plots here 
noPlots <- 4 
# save all variables in a seperate vector to select in for-loop 
allVars <- unique(gg$variable) 
noVars <- length(allVars) 

# indices for plotting variables 
plotSequence <- c(seq(0, noVars-1, by = noPlots), noVars) 

# pdf("plotpath.pdf") # uncomment to save the resulting plots in a pdf file 
# loop over the variables to plot 
for(ii in 2:length(plotSequence)){ 
    # select start and end of variables to plot 
    start <- plotSequence[ii-1] + 1 
    end <- plotSequence[ii] 

    # subset the variables and save new temporary data.frame 
    tmp <- subset(gg, variable %in% allVars[start:end]) 
    cat(unique(tmp$variable), "\n") 

    # generate plot 
    p <- ggplot(tmp, aes(x = Total, y = Admin))+ 
    geom_point(colour = "dark green", size = 1.5)+ 
    geom_point(aes(y = value, color = variable))+ 
    geom_smooth(aes(y = value, fill = variable), 
       method = loess, size = 1, linetype = 1, se = T)+ 
    facet_wrap(~variable, ncol = 2, nrow = 1000)+ 
    ylim(0, 1)+ 
    labs(x = "Expected", y = "Admin") 
    print(p) 
} 
# dev.off() 
+0

Wow. Grazie, ho inserito questo progetto nel dimenticatoio, ma il tuo codice ha fatto esattamente quello che stavo cercando. – ZTIrwin42

Problemi correlati