2012-04-04 14 views
18

En el libro de Hadley Wickham ggplot2 en el capítulo 10.3, hace alusión a las funciones de trazado. Quiero hacer muchas parcelas similares que usen facetas, pero no puedo referirme a una columna. Si todas mis referencias están en estética, entonces puedo usar aes_string y todo funciona. Facet_wrap parece no tener un análogo.Haciendo funciones de trazado con ggplot y aes_string

library(ggplot2) 
data(iris) 

Esta es la trama que quiero funcionalizar.

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

Esto funciona si no presento facetas.

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') 

¿Qué debería "sp" ser dos líneas a continuación? Una fórmula, una cadena? Tal vez todo el enfoque es incorrecto.

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= ?????) 

Además de una respuesta, me encantaría señalar cómo alguien aborda este problema.

+0

En cuanto a cómo abordar la solución de esta pregunta, probablemente verifique primero [StackOverflow] (http://stackoverflow.com/questions/8043247/writing-r-functions-with-optional-arguments) primero. :) – joran

+0

También se le preguntó aquí: http://stackoverflow.com/questions/11028353/passing-string-variable-facet-wrap-in-ggplot-using-r –

Respuesta

15

facet_wrap espera una fórmula como primer argumento, por lo que acababa de coaccionar con as.formula, y se alimentan en mi sp como una cadena:

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') 

Alternativamente si mi fórmula siempre se viera como ~[columnname], podría simplemente incorporar eso en flowerPlotWrap y pasar el nombre de la columna :

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') 

(felicidades por el ejemplo reproducible en su pregunta! Si todos hicieran preguntas y también obtendrían respuestas mucho más rápido).

+0

Gracias por la respuesta clara. ¿Cómo supiste que facet_wrap espera una fórmula? –

+0

Si nos fijamos en '? Facet_wrap' dice' facet_wrap (facets, ...) 'and' facets: formula especificando variabls to facet by'. –

1

Su función funcionó bien para mí sin modificaciones si acabo de utilizar sp='Species', es decir, el nombre de la variable que desea aplicar.

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

enter image description here