es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La salida de purrr::pmap() no es compatible con lo que ggplot::aes() espera.

Problema: La salida de purrr::pmap() es incompatible con ggplot::aes()

El siguiente reprex se reduce a una sola pregunta: ¿Hay alguna manera de usar los nombres de las variables entre comillas dentro de ggplot2::aes() en lugar de los nombres de texto plano? Por ejemplo: usamos típicamente ggplot(mpg, aes(displ, cyl)), ¿cómo hacer que aes() funcione normalmente con ggplot(mpg, aes("displ", "cyl")) ?

Si comprendió mi pregunta, el resto de este reprex realmente no agrega información. Sin embargo, lo agregué para dar una imagen completa del problema.


Más detalles: quiero usar las funciones de purrr para crear una gran cantidad de gráficos de exploración de datos sin esfuerzo. El problema es que purrr::pmap() proporciona los nombres de las variables entre comillas, que ggplot::aes() no entiende. Según tengo entendido, las funciones cat() y as.name() pueden tomar el nombre de la variable entre comillas y devolverlo de la forma típica que aes() entiende; sin comillas. Sin embargo, ninguna de ellas funcionó. El siguiente reprex reproduce el problema. He comentado el código para ahorrarle el dolor de entender lo que hace el código.

“`{r}

library(tidyverse)

Divida las clases de variables en numéricas y no numéricas. Objetivo: colocar una combinación de variables numéricas en los ejes y codificar una variable no numérica.

mpgnumeric <- maplgl(.x = seqalong(mpg), .f = ~ mpg[[.x]] %>% class() %in% c(“numeric”,”integer”))
mpg
factor <- maplgl(.x = seqalong(mpg), .f = ~ mpg[[.x]] %>% class() %in% c(“factor”,”character”))

crear todas las combinaciones posibles de las variables

edaroutinecombinations <- expandgrid(num1 = mpg[mpgnumeric] %>% names(),
num
2 = mpg[mpgnumeric] %>% names(),
fct = mpg[mpg
factor] %>% names()) %>%
filter(num1 != num2) %>% slice_head(n = 2) # para simplificar, mantener solo las primeras 2 combinaciones

usar purrr::pmap() para crear todos los gráficos que queremos en una sola llamada

pmap(.l = list(edaroutinecombinations$num1,
eda
routinecombinations$num2,
edaroutinecombinations$fct) ,
.f = ~ mpg %>%
ggplot(aes(..1 , ..2, col = ..3)) +
geom_point() )


A continuación, se señala el problema utilizando una llamada típica de <em>ggplot2</em>.

esto es lo que queremos que <code>purrr::pmap()</code> cree en sus iteraciones:

<code>{r}
mpg %>%<br>
ggplot(aes(displ , cyl, fill = drv)) +
geom_boxplot()
</code>

Sin embargo, esto es lo que <code>purrr::pmap()</code> genera; nombres de variables entre comillas:

```{r}
mpg %>%
ggplot(aes("displ" , "cyl", fill = "drv")) +
geom_boxplot()

</code></pre>

<hr>

<h1>Intentos fallidos</h1>

El uso de <code>cat()</code> para transformar los nombres de las variables entrecomillas de <code>pmap()</code> en forma no entre comillas para que <code>aes()</code> los entienda falla.

<code>{r}
mpg %>%<br>
ggplot(aes(cat("displ") , cat("cyl"), fill = cat("drv"))) +
geom_boxplot()
</code>

El uso de <code>as.name()</code> para transformar los nombres de las variables entrecomillas de <code>pmap()</code> en forma no entre comillas para que <code>aes()</code> los entienda falla.

```{r}
mpg %>%
ggplot(aes(as.name("displ") , as.name("cyl"), fill = as.name("drv"))) +
geom_boxplot()

```


Conclusión

¿Hay alguna forma de hacer que ggplot(aes("nombre_variable_comillas")) funcione correctamente?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Desafortunadamente, ggplot(aes(""nombre_var_comillas"")) no funcionará como se espera. En general, ggplot2 está diseñado para trabajar con nombres de variables sin comillas, y el uso de nombres con comillas dentro de aes() no funcionará correctamente.

    Una posible solución es usar el pronombre .data dentro de aes() para referirse a variables en el conjunto de datos usando nombres con comillas. Por ejemplo:

    “`{r}
    mpg %>%
    ggplot(aes(.data[[“displ”]], .data[[“cyl”]], fill = .data[[“drv”]])) +
    geom_boxplot()


    Esto también debería funcionar con `purrr::pmap()`, simplemente cambiando los nombres de variables a cadenas con comillas dentro de la llamada a `aes()`: ```{r} pmap(.l = list(eda_routine_combinations$num_1, eda_routine_combinations$num_2, eda_routine_combinations$fct) , .f = ~ mpg %>% ggplot(aes(.data[[..1]] , .data[[..2]], fill = .data[[..3]])) + geom_boxplot() )

    Note que usamos [[ en lugar de $ para extraer los nombres de variables, ya que [[ nos permite usar cadenas con comillas.

    Otro enfoque es usar rlang::sym() para convertir las cadenas con comillas en símbolos, y luego usar !! para descomillarlas dentro de aes(). Por ejemplo:

    “`{r}
    var1 <- “displ”
    var2 <- “cyl”
    var3 <- “drv”

    mpg %>%
    ggplot(aes(!!rlang::sym(var1), !!rlang::sym(var2), fill = !!rlang::sym(var3))) +
    geom_boxplot()


    Esto también debería funcionar dentro de `pmap()`: ```{r} pmap(.l = list(eda_routine_combinations$num_1, eda_routine_combinations$num_2, eda_routine_combinations$fct) , .f = ~ mpg %>% ggplot(aes(!!rlang::sym(..1), !!rlang::sym(..2), fill = !!rlang::sym(..3))) + geom_boxplot() )

Comments are closed.