Saltar al contenido

Cómo usar una variable para especificar el nombre de la columna en ggplot

Posteriormente a observar en diferentes repositorios y páginas de internet al concluir dimos con la respuesta que te compartiremos pronto.

Solución:

Puedes usar aes_string:

f <- function( column ) 
    ...
    ggplot( rates.by.groups, aes_string(x="name", y="rate", colour= column,
                                        group=column ) )

siempre que pase la columna a la función como un string (f("majr") en vez de f(majr)). También tenga en cuenta que cambiamos las otras columnas, "name" y "rate"para ser cadenas.

Si por alguna razón prefiere no usar aes_stringpodrías cambiarlo a (lo algo más engorroso):

    ggplot( rates.by.groups, aes(x=name, y=rate, colour= get(column),
                                        group=get(column) ) )

De las notas de publicación de ggplot2 V3.0.0 :

aes() ahora admite la cuasicomilla para que pueda usar !!, !!! y :=. Esto reemplaza a aes_() y aes_string() que ahora están en desuso (pero permanecerán por mucho tiempo).

La forma idiomática ahora sería convertir en un símbolo el string que contiene la variable, usando sym()(que es casi lo mismo que los alias base as.name() / as.symbol()), y quitar las comillas usando !!

Simulando los datos de OP podemos hacer:

library(tidyverse)
rates.by.groups <- data.frame(
  name = LETTERS[1:3],
  rate = 1:3,
  mjr = LETTERS[c(4,4,5)],
  gender = c("M","F","F")
)

f <- function(column) 
  column <- sym(column)
  ggplot(rates.by.groups, 
         aes(x = name, 
             y = rate, 
             fill  = !!column, 
             group = !!column)) +
    geom_col()


f("gender")
f("mjr")
x <- "gender"
f(x)

Si preferimos alimentar nombres sin procesar a la función, podemos hacer:

f2 <- function(column) 
  column <- ensym(column)
  ggplot(rates.by.groups, 
         aes(x = name, 
             y = rate, 
             fill  = !!column, 
             group = !!column)) +
    geom_col()

Funcionará con nombres, también conocidos como símbolos Y con string literales

f2(gender)
f2(mjr)
f2("gender")
f2("mjr")

Como dice Lionel sobre ensym():

está destinado a imitar la sintaxis de los argumentos donde puede proporcionar ambos en el LHS, por ejemplo, list(bare = 1, "quoted" = 2)


una nota sobre enquo()

enquo()cita la expresión (no necesariamente un símbolo) alimentada al argumento, no convierte un string literal a un símbolo como ensym() lo hace, por lo que podría estar menos adaptado aquí, pero podemos hacer:

f3 <- function(column) 
  column <- enquo(column)
  ggplot(rates.by.groups, 
         aes(x = name, 
             y = rate, 
             fill  = !!column, 
             group = !!column)) +
    geom_col()


f3(gender)
f2(mjr)

Otra opción (ggplot2 > 3.0.0) es usar el pronombre de evaluación ordenada .data para dividir la variable/columna elegida de la rates.by.groups marco de datos.

library(ggplot2)
theme_set(theme_classic(base_size = 14))

# created by @Moody_Mudskipper
rates.by.groups <- data.frame(
  name = LETTERS[1:3],
  rate = 1:3,
  mjr = LETTERS[c(4, 4, 5)],
  gender = c("M", "F", "F")
)

f1 <- function(df, column) 
  gg <- ggplot(df, 
         aes(x = name, 
             y = rate, 
             fill  = .data[[column]], 
             group = .data[[column]])) +
    geom_col() +
    labs(fill = column)
  return(gg)


plot_list <- lapply(list("gender", "mjr"), function(x) f1(rates.by.groups, x) )
plot_list
#> [[1]]

#> 
#> [[2]]

# combine all plots
library(egg)
ggarrange(plots = plot_list,
          nrow = 2,
          labels = c('A)', 'B)'))

Creado el 2019-04-04 por el paquete reprex (v0.2.1.9000)

valoraciones y comentarios

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *