2013-11-21 8 views
6

Impossibile trovare una risposta a questo - in ggplot2, è possibile sfaccettatura su una funzione di una colonna piuttosto che sul valore della colonna direttamente?ggplot2: sfaccettatura su una funzione della colonna

semplice esempio riproducibile:

dati del campione:

df=data.frame(dat=c(1,2,5,5,7)) 

questo funziona:

ggplot(df, aes(x=1:5, y=dat, colour=factor(dat > 3))) + 
     geom_point() + facet_grid(dat ~ .) 

Questo non lo fa:

ggplot(df, aes(x=1:5, y=dat, colour=factor(dat > 3))) + 
     geom_point() + facet_grid((dat > 3) ~ .) 

Una soluzione è quella di aggiungere una colonna solo per il sfaccettatura. Questo funziona:

df$facet=df$dat>3 
ggplot(df, aes(x=1:5, y=dat, colour=factor(dat > 3))) + 
     geom_point() + facet_grid(facet ~ .) 

Ma c'è un modo per farlo senza dover aggiungere una nuova colonna al data.frame?

+3

Qual è il problema con l'aggiunta di una nuova colonna? Mi piacerebbe piuttosto che aggiungere una nuova colonna sia più veloce grazie al vantaggio delle funzioni R native e della vettorizzazione. – Raffael

+2

La mia avversione principale all'aggiunta di una nuova colonna è che sembra poco elegante. ggplot2 è in grado di gestire la colorazione in base a una funzione di fattore: che dire della sfaccettatura? Che cosa succede se si desidera eseguire questa operazione su diverse funzioni di un fattore, ma non ingombrare il dataframe con colonne aggiuntive o preoccuparsi di creare e eliminarle? – nsheff

+1

Ricevo il tuo punto di vista - ci sono stato anch'io - ma alla fine è solo un problema di bellezza e se mi chiedi, per quanto mi diverta, è un linguaggio inelegante per design - il suo scopo è per fare bene il lavoro, ma non elegantemente. – Raffael

risposta

2

Ho trovato una soluzione di compromesso, che è un compromesso tra gli argomenti di @Nathan e @ Яaffael pubblicati nella sezione commenti.

FacetingFunction <- function(df) {df$dat > 3} 
ArbitraryFacetingPlot <- function(df, FacetingFunction) { 
    df$facet <- FacetingFunction(df) 
    p <- ggplot(df, aes(x=1:5, y=dat, colour=factor(dat > 3))) + 
    geom_point() + 
    facet_grid(facet ~ .) 
    df$facet <- NULL 
    p 
} 

ArbitraryFacetingPlot(df, FacetingFunction) 
ArbitraryFacetingPlot(df, function(df) {df$dat==5})