tutorial studio ggplot español r ggplot2

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