2011-10-15 8 views
7

Piuttosto che chiedere come tracciare set di dati di grandi dimensioni, voglio avvolgere plot in modo che il codice che produce molti diagrammi non venga martellato quando è tracciare un grande oggetto Come posso avvolgere lo plot con un modo molto semplice in modo che tutte le sue funzionalità siano preservate, ma i primi test per determinare se l'oggetto che viene passato è troppo grande?Wrapping La funzione di trama di R (o ggplot2) per evitare il tracciamento di set di dati di grandi dimensioni

Questo codice funziona per chiamate vanilla su plot, ma manca la stessa generalità di plot (vedere di seguito).

myPlot <- function(x, ...){ 
    isBad <- any((length(x) > 10^6) || (object.size(x) > 8*10^6) || (nrow(x) > 10^6)) 
    if(is.na(isBad)){isBad = FALSE} 
    if(isBad){ 
     stop("No plots for you!") 
    } 
    return(plot(x, ...)) 
} 

x = rnorm(1000) 
x = rnorm(10^6 + 1) 

myPlot(x) 

Un esempio in cui questo non riesce:

x = rnorm(1000) 
y = rnorm(1000) 
plot(y ~ x) 
myPlot(y ~ x) 

C'è qualche modo semplice per avvolgere plot per abilitare questa verifica dei dati da tracciati, pur passando attraverso tutti gli argomenti? Se no, allora che ne dici di ggplot2? Sono un pari non-plotter. (Nei casi in cui il set di dati è grande, userò hexbin, sub-campionamento, trame di densità, ecc, ma non è il fuoco qui.)


Nota 1: Quando si testa idee, vi consiglio di prova per dimensioni> 100 (o imposta una variabile, ad esempio myThreshold <- 1000), anziché contro una dimensione di> 1 M, altrimenti ci sarà molto dolore nel colpire il lento plottaggio. :)

risposta

6

Il problema riscontrato è che, come attualmente codificato, myplot() presuppone che x sia un oggetto dati, ma poi si prova a passargli una formula. I numeri plot() di R raggiungono questo metodo tramite i metodi: quando x è una formula, il metodo plot.formula() viene inviato al posto del metodo base plot.default().

Hai bisogno di fare lo stesso:

myplot <- function(x, ...) 
    UseMethod("myplot") 

myplot.default <- function(x, ....) { 
    isBad <- any((length(x) > 10^6) || (object.size(x) > 8*10^6) || 
        (nrow(x) > 10^6)) 
    if(is.na(isBad)){isBad = FALSE} 
    if(isBad){ 
     stop("No plots for you!") 
    } 
    invisible(plot(x, ...)) 
} 

myplot.formula <- function(x, ...) { 
    ## code here to process the formula into a data object for plotting 
    .... 
    myplot.default(processed_x, ...) 
} 

si può rubare il codice da plot.formula() di utilizzare il codice necessario per elaborare x in un oggetto. In alternativa, puoi lanciare il tuo seguendo lo standard non-standard evaluation rules (PDF).

+0

+1 per la pubblicazione della risposta corretta. – Andrie

+0

+1 Per informazioni dettagliate su cosa sta succedendo e per il molto utile puntatore al riferimento standard non standard. Puoi chiarire dove posso trovare il codice per 'plot.formula'? Suppongo che qualsiasi codice che estrae gli oggetti da una formula funzionerà, quindi lo sto anche cercando. – Iterator

+1

@Iterator 'graphics ::: plot.formula' o' getAnywhere (plot.formula) 'mostrerà il codice. 'methods (plot)' mostrerà quali metodi S3 sono disponibili per il plot generico. Si noti che 'plot.formula' è mostrato con un' * 'nell'output da' methods() ', che indica che la funzione stessa non viene esportata dal namespace; invece è registrato come metodo S3 per la spedizione. –

Problemi correlati