2011-10-19 16 views
7

Vorrei passare attraverso una lunga serie di grafici qplots o ggplot2, fermandomi in ciascuna di esse in modo da poterle esaminare prima di procedere.Ciclo attraverso una serie di qplot

Il seguente codice non produce piazzole:

library(ggplot2) 
par(ask=TRUE) 
for(Var in names(mtcars)) { 
    qplot(mtcars[,Var], wt, data=mtcars, xlab=Var) 
} 

ma se corro questa linea dopo l'esecuzione del ciclo, io capisco un complotto:

qplot(mtcars[,Var], wt, data=mtcars, xlab=Var) 

Qual è il motivo di questo comportamento? Come posso visualizzare i grafici all'interno del ciclo?

Follow-up: Esiste un modo più elegante di scorrere le variabili rispetto all'utilizzo di mtcars[,Var] e xlab=Var?

+3

Prova a completare la chiamata 'qplot' in una' stampa'. Vedi 7.22 delle FAQ R. – James

risposta

10

Come le altre risposte hanno detto, avvolgere ogni chiamata qplot() in print() (questo è R FAQ 7.22). Il motivo per cui i ggplot non vengono stampati sul dispositivo grafico fino a quando non viene richiamato lo print.ggplot. print() è una funzione generica inviata a print.ggplot dietro le quinte.

Quando si lavora nel repl ("ciclo di lettura-valuta-stampa", ovvero shell), il valore di ritorno della riga di input precedente viene stampato automaticamente tramite una chiamata implicita a print(). Ecco perché qplot(mtcars[,Var], wt, data=mtcars, xlab=Var) funziona per te. Non ha niente a che fare con scope o for loop. Se dovessi mettere quella linea in un'altra posizione che non ritorna direttamente al repl, come in una funzione che restituisce qualcos'altro, non farebbe nulla.

+0

Grazie, ho corretto la mia risposta. – ROLO

5

Aggiungere print:

library(ggplot2) 
par(ask=TRUE) 
for(Var in names(mtcars)) { 
    print(qplot(mtcars[,Var], wt, data=mtcars, xlab=Var)) 
} 

Per una spiegazione si veda la risposta di Tavis Rudd.

6

Recentemente ho fatto qualcosa di simile e ho pensato di menzionare due bit in più di codice che mi hanno aiutato. Ho inserito questa riga nel ciclo for per fare R pausa per un momento (in questo caso, mezzo secondo) dopo la stampa di ogni trama:

Sys.sleep(0.5) 

In alternativa, invece di vedere le trame sullo schermo, si potrebbe salvarli direttamente su file e quindi sfogliarli a piacimento. O nel mio caso, stavo cercando di animare la traiettoria di un'ape che stavamo monitorando, così ho importato la sequenza di immagini in ImageJ e salvata come una gif animata.

library(ggplot2) 
png(file="cars%d.png") 
for(Var in names(mtcars)) { 
print(qplot(mtcars[,Var], wt, data=mtcars, xlab=Var)) 
} 
dev.off()