Tengo un comando ggplot
ggplot( rates.by.groups, aes(x=name, y=rate, colour=majr, group=majr) )
dentro de una función. Pero me gustaría poder usar un parámetro de la función para seleccionar la columna para usar como color y grupo. Es decir, me gustaría algo como esto
f <- function( column ) {
...
ggplot( rates.by.groups, aes(x=name, y=rate, colour= ??? , group=??? ) )
}
De modo que la columna utilizada en el ggplot está determinada por el parámetro. Por ejemplo, para f ("majr") obtenemos el efecto de
ggplot( rates.by.groups, aes(x=name, y=rate, colour=majr, group=majr) )
pero para f ("género") obtenemos el efecto de
ggplot( rates.by.groups, aes(x=name, y=rate, colour=gender, group=gender) )
Algunas cosas que probé:
ggplot( rates.by.groups, aes(x=name, y=rate, colour= columnName , group=columnName ) )
no funcionó. Ni hicimos
e <- environment()
ggplot( rates.by.groups, aes(x=name, y=rate, colour= columnName , group=columnName ), environment=e )
aes_string(x = rates.by.groups$name...
, y de todos modos no es necesario, ya que ya pasó elggplot(data = rates.by.groups...
argumento. (El problema en esta pregunta )"column_name"
o"column"
no funcionaríaDe las notas de la versión de
ggplot2 V3.0.0
:La forma idiomática ahora sería convertir a un símbolo la cadena que contiene la variable, usando
sym()
(que es casi lo mismo que los alias baseas.name()
/as.symbol()
), y descomillando usando!!
Simulando los datos de OP podemos hacer:
Si preferimos alimentar nombres sin formato a la función, podemos hacer:
Funcionará con nombres también conocidos como símbolos Y con cadenas literales
Como dice Lionel sobre
ensym()
:Una nota sobre
enquo()
enquo()
cita la expresión (no necesariamente un símbolo) alimentada al argumento, no convierte un literal de cadena en un símbolo como loensym()
hace, por lo que podría estar menos adaptado aquí, pero podemos hacer:fuente
aes()
sí misma hablaenquo()
pero no funciona. ¿Y quién escuchóensym()
antes? BIGf2
, los cuatro ejemplos funcionan, y también lo hace la captura del nombre de la columna en una variable (es deciraname <- "mjr"; f2(aname)
). Si agrego código para manipular el marco de datosdplyr
, intenta encontrar una columna usando el nombre de la variable y no la cadena en el nombre de la variable. En otras palabras, ¿cómo me pongorates.by.groups %>% group_by(!!column)...
a trabajar y sigo apoyando las tres formas de llamarf2
?ensym
está diseñado para tratar con argumentos proporcionados como nombres y tolerar comillas alrededor de ellos. Creo que le gustaría tratar el argumento como un nombre y recurrir al valor si no se encuentra el nombre. Esto es realmente lo que sucede conselect
, pero no congroup_by
... Es posible esquivarlo, pero no es obvio. Si es importante para ti, creo que merecería su propia pregunta.select
ygroup_by
ese era probablemente el problema. Puedo crear una nueva pregunta, pero necesito dar un ejemplo simple y verificar si se ha respondido. Puedo publicarlo si no.facet_grid
? Funciona con,facet_grid(cols = vars(!!column))
pero arroja un error confacet_grid(~ !!column)
Intente usar en
aes_string
lugar deaes
.fuente
Otra opción (
ggplot2 > 3.0.0
) es usar el pronombre de evaluación tidy.data
para cortar la variable / columna elegida delrates.by.groups
marco de datos.Creado el 2019-04-04 por el paquete reprex (v0.2.1.9000)
fuente
El uso
aes_string
soluciona este problema, pero enfrenta un problema al agregar barras de errorgeom_errorbar
. A continuación se muestra una solución sencilla.Además, también puede agregar facetas a su trama usando estas líneas dentro del ggplot:
Este script fue modificado de esta publicación original: ggplot2 - Barras de error usando una función personalizada
fuente
He aquí un ejemplo extremadamente simple.
Solo haz dos cosas
!!
cuando lo usesfuente