argendatafundar / argendataR

Librería de R para ETL de argendata
Creative Commons Attribution 4.0 International
0 stars 1 forks source link

Agregar interactividad de plotly en el gráfico de comparación de variables numéricas #18

Open Ignacio-Ibarra opened 2 weeks ago

Ignacio-Ibarra commented 2 weeks ago

Los gráficos de comparación actualmente son gráficos estáticos basados en ggplot2 de R. Podríamos utilizar la función plotly::ggplotly para convertir rápidamente gráficos de ggplot a plotly, agregándole interactividad a los gráficos de comparación de los scripts que generan outputs.

Asumimos que tenemos un objeto de tipo list denominado comparacion que posee los datos de la comparación entre el df_anterior y el df_output. Por ende conocemos cuales son las primary keys pk bajo las cuales se realiza la comparación. La lista comparacion contiene además un data.frame que resulta de hacer un left_join entre el df_anterior y el df_output, guardado en comparacion$joined_df.

El código a continuación muestra como se podría generar facilmente un gráfico interactivo con plotly

# instalo librería
# install.packages('plotly')

# Tengo mi data.frame de comparación
joined_df <- comparacion$joined_df

print(joined_df)
# # A tibble: 390 × 6
# anio letra letra_desc_abrev.x          porc_mujeres.x letra_desc_abrev.y          porc_mujeres.y
# <dbl> <chr> <chr>                                <dbl> <chr>                                <dbl>
#   1  1996 A     Agro                                0.0918 Agro                                0.0918
# 2  1996 B     Pesca                               0.101  Pesca                               0.101 
# 3  1996 C     Petróleo y minería                  0.0782 Petróleo y minería                  0.0782
# 4  1996 D     Industria manufacturera             0.180  Industria manufacturera             0.180 
# 5  1996 E     Electricidad, gas y agua            0.132  Electricidad, gas y agua            0.132 
# 6  1996 F     Construcción                        0.0457 Construcción                        0.0457
# 7  1996 G     Comercio                            0.280  Comercio                            0.280 
# 8  1996 H     Hotelería y restaurantes            0.343  Hotelería y restaurantes            0.343 
# 9  1996 I     Transporte y comunicaciones         0.113  Transporte y comunicaciones         0.113 
# 10  1996 J     Finanzas                            0.375  Finanzas                            0.375 
# # ℹ 380 more rows

# Conozco cuales son mis primary keys
primary_keys <- c('anio','letra')

# Genero una columna de etiquetas para el tooltip, con las columnas que son pk
joined_df$label <- apply(joined_df[primary_keys], 1, function(row) paste(row, collapse = " - "))

# Conozco la columna numérica que quiero comparar. 
col_comparar <- 'porc_mujeres'
cols_comp <- paste0(col_comparar, c('.x','.y'))
col_x <- cols_comp[1]
col_y <- cols_comp[2]

# Genero scatter de ggplot
scatter <-  ggplot(joined_df, aes_string(x = col_x, y = col_y, label = "label"))+
  geom_point() +
  geom_abline(slope = 1,color = "red", alpha = 0.7) +
  theme_minimal() +
  labs(title = "Scatterplot dinámico", x = cols_comp[1], y = cols_comp[2])

# Agregar interactividad con plotly
interactive_scatter <- plotly::ggplotly(scatter, tooltip = 'label')

# Mostrar el scatter interactivo
interactive_scatter

image

Ignacio-Ibarra commented 2 weeks ago

El scatter hay que hacerlo con el método tradicionael de aes(...) y no aes_string(...) porque éste ultimo pronto quedará deprecado. En este caso debería hacerse:

# Genero scatter de ggplot
scatter <-  ggplot(joined_df, aes(x = !!sym(col_x), y = !!sym(col_y), label = label))+
  geom_point() +
  geom_abline(slope = 1,color = "red", alpha = 0.7) +
  theme_minimal() +
  labs(title = "Scatterplot dinámico", x = cols_comp[1], y = cols_comp[2])