r: cree múltiples gráficos circulares con porcentajes recorriendo las columnas usando ggplot

CorePress2024-01-25  84

Me gustaría recorrer algunas variables (col_names) y luego trazar un gráfico circular con porcentajes para cada categoría. No pude encontrar ningún código para reutilizar usando este gráfico, solo gráficos de barras o series de tiempo. Éste era el más cercano.

Este es un código de simulación para reproducir

ds <- data.frame(
    cat_Var1 = rep(c("stay","go"), 20),
    cat_var2 = rep(c("male","female"), 20),
    cat_var3 = rep(c("dogs","cats","birds"), 40)
)

col_names <- ds %>% select(cat_Var1:cat_var3) %>% names()
for(i in col_names) {
  plot <- ds %>% 
    count(.data[[i]]) %>% 
    mutate(per = n/sum(n)) %>% 
    ggplot() +
    geom_bar(aes(x="", y=per, fill=factor(i)), stat="identity", width = 1)+
    coord_polar("y", start=0, direction = -1)
  print(plot)
}

Me gustaría utilizar funciones de tidyverse (si es posible). Gracias



------------------------------------

Si primero crea una función que crea un ggplot a partir de una de sus columnas categóricas, puede usar purrr::map para aplicar esa función en cada una de las columnas. La lista resultante de ggplots se puede ensamblar con, por ejemplo. labor de retazos. YPodrías hacerlo así:

library(tidyverse)

theme_set(theme_void())

ds <- tibble(
  var1 = rep(c("stay","go"), 15),
  var2 = rep(c("male","female"), 15),
  var3 = rep(c("dogs","cats","birds"), 10)
)

pieplotter <- function(col) {
  tibble(var = col) %>% 
    count(var) %>% 
    mutate(
      p = n/sum(n),
      y_mid = lag(cumsum(p), default = 0) + (p/2) 
    ) %>% 
    ggplot() +
    geom_col(
      aes(x = "", y = p, fill = var)
    ) +
    coord_polar(theta = "y") +
    geom_text(
      aes(x = "", y = y_mid, label = scales::percent(p))
    ) +
    theme(
      axis.text.x = element_blank()
    )
}

map(ds, pieplotter) %>% patchwork::wrap_plots()

Creado el 29-03-2021 por el paquete reprex (v1.0.0)

2

fantástico! ¿Hay alguna manera de usar columnas específicas del ds en lugar de usar todo el marco de datos?

-Luis

29/03/2021 a las 17:05

1

Sí, puedes usar ds %>% select(...) %>% mapa(plotter)

-Peter H.

30 de marzo de 2021 a las 7:33



------------------------------------

El problema parece ser que col_names es un vector de caracteres, lo que significa que i en fill=factor(i) es una cadena cuando en realidad debería ser un símbolo. En este caso, ggplot interpreta el valor de relleno como un vector con un valor, por lo que el gráfico circular es de un color sólido.

La llamada a geom_bar debería ser esta:

geom_bar(aes(x="", y=per, fill=factor(!!sym(i))), stat="identity", width = 1)

Explicación:

sym convierte la cadena dada con i en un símbolo !! evalúa el símbolo que hace referencia a la columna que contiene las categorías para el gráfico circular en el marco de datos que se pasa

1

Increíble y gracias por explicar cada parte de tu código. Lo único que aún falta es el porcentaje dentro de cada segmento del gráfico circular. Si es posible, ¿sabe cómo introducir esta información en el gráfico? ¡Gracias!

-Luis

28/03/2021 a las 21:12

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare