1 Exploración interactiva de datos con plotly

Author: Mike Jeziorski
Date: 5/13/2021

El código de R de este archivo está disponbie vía GitHub.

1.1 Introducción a plotly

Link a la presentación Introducción a plotly.

1.2 Graficando datos de palmerpenguins con plotly

# install.packages(c("tidyverse", "plotly", "palmerpenguins"))

library(palmerpenguins) # juego de datos científicos
library(tidyverse) # incluye dplyr y ggplot2
## ── Attaching packages ─────────────────────────────────────────────────────────────────────────────── tidyverse 1.3.0 ──
## ✔ ggplot2 3.3.3     ✔ purrr   0.3.4
## ✔ tibble  3.0.6     ✔ dplyr   1.0.4
## ✔ tidyr   1.1.2     ✔ stringr 1.4.0
## ✔ readr   1.4.0     ✔ forcats 0.5.1
## ── Conflicts ────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
library(plotly)
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout
glimpse(penguins)
## Rows: 344
## Columns: 8
## $ species           <fct> Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Ade…
## $ island            <fct> Torgersen, Torgersen, Torgersen, Torgersen, Torgersen, Torgersen, Torgersen, Torgersen, Tor…
## $ bill_length_mm    <dbl> 39.1, 39.5, 40.3, NA, 36.7, 39.3, 38.9, 39.2, 34.1, 42.0, 37.8, 37.8, 41.1, 38.6, 34.6, 36.…
## $ bill_depth_mm     <dbl> 18.7, 17.4, 18.0, NA, 19.3, 20.6, 17.8, 19.6, 18.1, 20.2, 17.1, 17.3, 17.6, 21.2, 21.1, 17.…
## $ flipper_length_mm <int> 181, 186, 195, NA, 193, 190, 181, 195, 193, 190, 186, 180, 182, 191, 198, 185, 195, 197, 18…
## $ body_mass_g       <int> 3750, 3800, 3250, NA, 3450, 3650, 3625, 4675, 3475, 4250, 3300, 3700, 3200, 3800, 4400, 370…
## $ sex               <fct> male, female, female, NA, female, male, female, male, NA, NA, NA, NA, female, male, male, f…
## $ year              <int> 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2…
summary(penguins)
##       species          island    bill_length_mm  bill_depth_mm   flipper_length_mm  body_mass_g       sex     
##  Adelie   :152   Biscoe   :168   Min.   :32.10   Min.   :13.10   Min.   :172.0     Min.   :2700   female:165  
##  Chinstrap: 68   Dream    :124   1st Qu.:39.23   1st Qu.:15.60   1st Qu.:190.0     1st Qu.:3550   male  :168  
##  Gentoo   :124   Torgersen: 52   Median :44.45   Median :17.30   Median :197.0     Median :4050   NA's  : 11  
##                                  Mean   :43.92   Mean   :17.15   Mean   :200.9     Mean   :4202               
##                                  3rd Qu.:48.50   3rd Qu.:18.70   3rd Qu.:213.0     3rd Qu.:4750               
##                                  Max.   :59.60   Max.   :21.50   Max.   :231.0     Max.   :6300               
##                                  NA's   :2       NA's   :2       NA's   :2         NA's   :2                  
##       year     
##  Min.   :2007  
##  1st Qu.:2007  
##  Median :2008  
##  Mean   :2008  
##  3rd Qu.:2009  
##  Max.   :2009  
## 
penguins_hm <- penguins %>%
      filter(!is.na(sex)) %>%
      dplyr::count(species, island, sex) %>%
      ggplot(aes(x = sex, y = species, fill = n)) +
      geom_tile() +
      facet_grid(~ island) +
      theme_classic() +
      labs(title = "Distribution of penguins")
ggplotly(penguins_hm)
penguins_sp <- penguins %>%
      filter(!is.na(sex)) %>%
      ggplot(aes(x = bill_length_mm, y = body_mass_g, shape = sex, color = species, 
                 text = paste0("Sex: ", sex,
                               "\nIsland: ", island,
                               "\nYear: ", year))) +
      geom_point() +
      scale_shape_manual(values = c(1, 16)) +
      labs(x = "Bill length (mm)", y = "Body mass (g)")
plotly::ggplotly(penguins_sp, tooltip = "text")
penguins_sp_i <- penguins %>%
   filter(!is.na(sex)) %>%
   plotly::plot_ly(x = ~bill_length_mm, y = ~body_mass_g, color = ~species,
                type = "scatter", mode = "markers")
# install.packages("htmlwidgets")
library(htmlwidgets)
htmlwidgets::saveWidget(penguins_sp_i, "penguins_scatterplot.html")

1.3 Graficando datos de COVID con plotly

Datos del la Secretaría de Salud, Gobierno de México Fuente de los datos: https://datos.gob.mx/busca/dataset/informacion-referente-a-casos-covid-19-en-mexico Datos crudos: https://www.gob.mx/salud/documentos/datos-abiertos-152127

El archivo “qro_raw_210513.csv” contiene los datos para el 13 de mayo de 2021, filtrado para los residentes del estado de Querétaro.

qro_raw <- readr::read_csv("qro_raw_210513.csv")
## 
## ── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────
## cols(
##   .default = col_double(),
##   FECHA_ACTUALIZACION = col_date(format = ""),
##   ID_REGISTRO = col_character(),
##   ENTIDAD_UM = col_character(),
##   ENTIDAD_NAC = col_character(),
##   MUNICIPIO_RES = col_character(),
##   FECHA_INGRESO = col_date(format = ""),
##   FECHA_SINTOMAS = col_date(format = ""),
##   FECHA_DEF = col_date(format = ""),
##   PAIS_NACIONALIDAD = col_character()
## )
## ℹ Use `spec()` for the full column specifications.
qro_covid_pos <- qro_raw %>%
      
      mutate(sexo = case_when(SEXO == 1 ~ "Mujer",
                              SEXO == 2 ~ "Hombre",
                              SEXO == 99 ~ NA_character_),
             tipo_paciente = case_when(TIPO_PACIENTE == 1 ~ "Ambulatorio",
                                       TIPO_PACIENTE == 2 ~ "Hospitalizado",
                                       TIPO_PACIENTE == 99 ~ NA_character_)) %>%
      filter(RESULTADO_LAB == 1) %>%
      ggplot(aes(x = FECHA_INGRESO, fill = as.factor(tipo_paciente))) +
      geom_bar() +
      labs(x = "Fecha de visita", y = "Total",
           title = "Pacientes positivos en el Edo. de Querétaro (muertos en morado)",
           caption = "Fuente: Dirección General de Epidemiología, Gobierno de México") +
      scale_fill_manual(name = "Tipo de paciente", 
                        labels = c("Ambulatorio", "Hospitalizado"),
                        values = c("blue", "red")) +
      geom_bar(aes(x = FECHA_DEF), fill = "purple") +
      theme_classic()
ggplotly(qro_covid_pos)
def_emb <- filter(qro_raw, RESULTADO_LAB == 1, EMBARAZO == 1, !is.na(FECHA_DEF)) %>%
      nrow()
qro_covid_emb <- qro_raw %>%
      mutate(sexo = case_when(SEXO == 1 ~ "Mujer",
                              SEXO == 2 ~ "Hombre",
                              SEXO == 99 ~ NA_character_),
             tipo_paciente = case_when(TIPO_PACIENTE == 1 ~ "Ambulatorio",
                                       TIPO_PACIENTE == 2 ~ "Hospitalizado",
                                       TIPO_PACIENTE == 99 ~ NA_character_)) %>%
      filter(RESULTADO_LAB == 1, EMBARAZO == 1) %>%
      ggplot(aes(x = FECHA_INGRESO, y = EDAD, color = as.factor(TIPO_PACIENTE))) +
      geom_point() +
      labs(x = "Fecha de ingreso", y = "Edad",
           title = "Mujeres embarazadas positivas para el virus en Edo. de Querétaro",
           subtitle = paste0("Número de defunciones: ", def_emb),
           caption = "Fuente: Dirección General de Epidemiología, Gobierno de México") +
      scale_color_manual(name = "Tipo de paciente", 
                        labels = c("Ambulatoria", "Hospitalizada"),
                        values = c("blue", "red")) +
      ylim(c(0, 50)) +
      theme_classic()
ggplotly(qro_covid_emb, tooltip = c("FECHA_INGRESO", "EDAD"))