studio - Haciendo funciones de trama con ggplot y aes_string
ggplot2 tutorial español (3)
En el libro ggplot2 de Hadley Wickham en el capítulo 10.3, alude a hacer funciones de trama. Quiero hacer muchas gráficas similares que usan facetado, pero no puedo referirme a una columna. Si todas mis referencias son estéticas, puedo usar aes_string y todo funciona. Facet_wrap parece no tener un análogo.
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 me faceta.
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 ser "sp" dos líneas abajo? ¿Una fórmula, una cuerda? Tal vez todo el enfoque está mal.
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 saber cómo alguien aborda este problema.
Aquí hay algunas alternativas que usan nuevas características de ggplot2 V3.0.0
Usando cuerdas:
flowerPlot <- function(dat, sl, sw, pl, sp){
ggplot(data=dat, aes(x=!!ensym(sl), y=!!ensym(sw), color=!!ensym(pl))) +
geom_point() +
facet_wrap(eval(expr(~!!ensym(sp))))
}
flowerPlot(iris, sl=''Sepal.Length'', sw=''Sepal.Width'', pl=''Petal.Length'', sp = ''Species'')
Usando nombres:
flowerPlot2 <- function(dat, sl, sw, pl, sp){
ggplot(data=dat, aes(x=!!enquo(sl), y=!!enquo(sw), color=!!enquo(pl))) +
geom_point() +
facet_wrap(eval(expr(~!!enquo(sp))))
}
flowerPlot2(iris, sl= Sepal.Length, sw=Sepal.Width, pl=Petal.Length, sp = Species)
Su función funcionó bien para mí sin modificar si acabo de usar sp=''Species''
, es decir, el nombre de la variable con la que desea facetar.
flowerPlotWrap(iris, sl=''Sepal.Length'', sw=''Sepal.Width'', pl=''Petal.Length'', sp=''Species'')
facet_wrap
espera una fórmula como su primer argumento, así que simplemente la coaccionaré con as.formula
, y as.formula
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 vería como ~[columnname]
, podría flowerPlotWrap
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 tu pregunta! Si todos hicieran preguntas y obtendrían respuestas mucho más rápido).