2012-04-04 12 views
18

Nel libro ggplot2 di Hadley Wickham nel capitolo 10.3, si allude a fare le funzioni di stampa. Voglio fare molti grafici simili che usano la sfaccettatura, ma non posso riferirmi a una colonna. Se tutte le mie referenze sono estetiche, allora posso usare aes_string e tutto funziona. Facet_wrap sembra non avere un analogo.Creazione delle funzioni di stampa con ggplot e aes_string

library(ggplot2) 
data(iris) 

Questa è la trama che voglio funzionalizzare.

pl.flower1 <- ggplot(data=iris, 
        aes_string(x='Sepal.Length', y='Sepal.Width', color='Petal.Length')) + 
           geom_point() +facet_wrap(~Species) 

Questo funziona se non lo faccio sfaccettatura.

flowerPlot <- function(dat, sl, sw, pl, sp){ 
    ggplot(data=dat, aes_string(x=sl, y=sw, color=pl)) + geom_point() 
} 
pl.flower2 <- flowerPlot(iris, sl='Sepal.Length', sw='Sepal.Width', pl='Petal.Length') 

Cosa dovrebbe "sp" essere due righe sotto? Una formula, una stringa? Forse l'intero approccio è sbagliato.

flowerPlotWrap <- function(dat, sl, sw, pl, sp){ 
     ggplot(data=dat, aes_string(x=sl, y=sw, color=pl)) + geom_point() +facet_wrap(sp) 
    } 
    pl.flower3 <- flowerPlotWrap(iris, sl='Sepal.Length', sw='Sepal.Width', pl='Petal.Length', sp= ?????) 

Oltre a una risposta, mi piacerebbe puntatore su come qualcuno si avvicina a questo problema?

+0

Per quanto riguarda come risolvere la domanda, probabilmente controllerò prima [StackOverflow] (http://stackoverflow.com/questions/8043247/writing-r-functions-with-optional-arguments). :) – joran

+0

Anche chiesto qui: http://stackoverflow.com/questions/11028353/passing-string-variable-facet-wrap-in-ggplot-using-r –

risposta

15

facet_wrap aspetta una formula come primo argomento, quindi mi piacerebbe solo costringere con as.formula, e dei mangimi nel mio sp come una stringa:

flowerPlotWrap <- function(dat, sl, sw, pl, sp){ 
     ggplot(data=dat, aes_string(x=sl, y=sw, color=pl)) + 
     geom_point() +facet_wrap(as.formula(sp)) # note the as.formula 
} 
pl.flower3 <- flowerPlotWrap(iris, sl='Sepal.Length', 
          sw='Sepal.Width', pl='Petal.Length', 
          sp= '~Species') 

alternativa se la mia formula assomigliava sempre a ~[columnname], potevo semplicemente aggiungerla a flowerPlotWrap e passare il nome della colonna :

flowerPlotWrap <- function(dat, sl, sw, pl, sp){ 
     ggplot(data=dat, aes_string(x=sl, y=sw, color=pl)) + 
     geom_point() +facet_wrap(as.formula(sprintf('~%s',sp))) 
} 
pl.flower3 <- flowerPlotWrap(iris, sl='Sepal.Length', 
          sw='Sepal.Width', pl='Petal.Length', 
          sp= 'Species') 

(complimenti per l'esempio riproducibile nella tua domanda! Se tutti facessero domande così come ottenerebbero risposte molto più veloci).

+0

Grazie per la risposta chiara. Come hai capito che facet_wrap si aspetta una formula? –

+0

Se si guarda '? Facet_wrap', si dice' facet_wrap (facets, ...) 'e' facets: formula che specifica variabl da sfaccettatura di'. –

1

La funzione ha funzionato bene per me non modificata se ho appena utilizzato sp='Species', ovvero il nome della variabile che si desidera sfaccettare.

flowerPlotWrap(iris, sl='Sepal.Length', sw='Sepal.Width', pl='Petal.Length', sp='Species')

enter image description here

Problemi correlati