2012-09-04 12 views
8

Non sono sicuro in che modo sfaccettare una funzione dei dati nell'elemento data di un oggetto ggplot. Nel seguente esempio giocattolo, quello che voglio fare è qualcosa di simile:ggplot - sfaccettatura in base all'output di funzione

df <- data.frame(x=1:8, y=runif(8), z=8:1) 
ggplot(df, aes(x=x, y=y)) + geom_point() + facet_wrap(~ (z %% 2)) 

Ma che dà l'errore: Error in layout_base(data, vars, drop = drop) : At least one layer must contain all variables used for facetting.

posso ottenere il risultato desiderato trasformando il frame di dati:

ggplot(transform(df, z=z%%2), aes(x=x, y=y)) + geom_point() + facet_wrap(~ z) 

ma spesso è desiderabile non utilizzare tale trasformazione, ad esempio se sono già stata data un'oggetto ggplot e voglio aggiungere alcune sfaccettature ad-hoc.

risposta

3

mi sembra familiare, ma non sono mai riuscito a risolverlo - penso che la gestione delle variabili sfaccettate sia meno potente della gestione delle variabili estetiche.

Indirizzamento del requisito di root - a facet ad hoc un ggplot esistente; notare che è possibile sostituire insieme all'ingrosso dei dati (master) di un R ggplot esistente - per esempio

myplot %+% transform(myplot$data, z=z%%2) 
+1

'MyPlot $ data $ zz <- MyPlot $ data $ z %% 2' può essere ancora più semplice. –

+0

@Josh, true, ma si basa sul set di dati già installato. A volte costruisco ggplot senza dati e quindi applico più set di dati. –

+0

È molto simile alla soluzione che ho usato anch'io - 'myplot $ data <- transform (myplot $ data, z = z %% 2)'. Ho ottenuto uno spazio dei nomi bruciato un paio di volte da '% +%' perché alcuni altri pacchetti definivano lo stesso operatore. Mi ci sono voluti * ore * per capirlo. –