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.

Gráfico aluvial con 2 fuentes diferentes pero una variable convergente/compartida [R]

Tengo experiencia en la creación de gráficos aluviales utilizando el paquete “ggalluvial”. Sin embargo, me he encontrado con un problema cuando intento crear un gráfico aluvial con dos fuentes diferentes que convergen en una variable.

Aquí hay un ejemplo de datos:

library(dplyr)
library(ggplot2)
library(ggalluvial)

data <- data.frame(
  unique_alluvium_entries = seq(1:10),
  label_1 = c("A", "B", "C", "D", "E", rep(NA, 5)),
  label_2 = c(rep(NA, 5), "F", "G", "H", "I", "J"),
  shared_label = c("a", "b", "c", "c", "c", "c", "c", "a", "a", "b")
)

Aquí está el código que uso para hacer el gráfico:

“`{r}

<h1>Preparar los datos</h1>

data <- data %>%
group_by(shared_label) %>%
mutate(freq = n())

data <- reshape2::melt(data, id.vars = c("unique_alluvium_entries", "freq"))
data$variable <- factor(data$variable, levels = c("label_1", "shared_label", "label_2"))

<h1>Crear el gráfico</h1>

ggplot(data,
aes(x = variable, stratum = value, alluvium = unique_alluvium_entries,
y = freq, fill = value, label = value)) +
scale_x_discrete(expand = c(.1, .1)) +
geom_flow() +
geom_stratum(color = "grey", width = 1/4, na.rm = TRUE) +
geom_text(stat = "stratum", size = 4) +
theme_void() +
theme(
axis.text.x = element_text(size = 12, face = "bold")
)
“`

Como puedes ver, puedo eliminar los valores NA, pero la etiqueta “shared_label” no se apila correctamente. Cada fila única debería apilarse encima de las demás en la columna “shared_label”. Esto también solucionaría el problema de tamaño para que sean de tamaño igual a lo largo del eje y.

¿Alguna idea de cómo solucionar esto? He probado “ggsankey”, pero surge el mismo problema y no puedo eliminar los valores NA. ¡Cualquier consejo es muy apreciado!

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Una posible solución a este problema es crear una variable ficticia adicional para la columna shared_label de modo que se pueda apilar correctamente. Aquí hay un ejemplo de código que incluye esta modificación:

    # crear una copia del marco de datos con una variable ficticia para shared_label
    data_shared <- data
    data_shared$shared_label_dummy <- data_shared$shared_label
    
    # rellenar los NA en label_1 y label_2 con las shared_labels correspondientes
    data_shared$label_1[is.na(data_shared$label_1)] <- 
      data_shared$shared_label_dummy[is.na(data_shared$label_1)]
    data_shared$label_2[is.na(data_shared$label_2)] <- 
      data_shared$shared_label_dummy[is.na(data_shared$label_2)]
    
    # agrupar por la nueva variable ficticia y preparar los datos para graficar
    data_shared <- data_shared %>%
      group_by(shared_label_dummy) %>%
      mutate(freq = n())
    
    data_shared <- reshape2::melt(data_shared, 
                                  id.vars = c("unique_alluvium_entires", 
                                              "freq", "shared_label_dummy"))
    data_shared$variable <- factor(data_shared$variable, 
                                    levels = c("label_1", "shared_label_dummy", "label_2"))
    
    # graficar el marco de datos modificado con ggalluvial
    ggplot(data_shared, 
           aes(x = variable, stratum = value, alluvium = unique_alluvium_entires,
               y = freq, fill = value, label = value)) +
      scale_x_discrete(expand = c(.1, .1)) + 
      geom_flow() +
      geom_stratum(color = "grey", width = 1/4, na.rm = TRUE) +
      geom_text(stat = "stratum", size = 4) +
      theme_void() +
      theme(
        axis.text.x = element_text(size = 12, face = "bold")
      )
    

    ¡Esto debería producir un gráfico donde la columna shared_label se apile correctamente y cada fila única tenga el mismo tamaño en el eje y. Avísame si esto ayuda!

Comments are closed.