Grafica de Barras:

1. Descargamos los datos del examen:

# Leemos la base de datos
el_dist <- read.csv("http://segasi.com.mx/clases/cide/datos/cp_2018_dtto.csv")

Proposito de la grafica:

Vamos a elaborar una grafica de barras en la cual observemos la votacion del bronco a nivel estatal.

Primero: Limpiamos la base:

library(tidyverse)
## ── Attaching packages ───────────────────────────────────── tidyverse 1.2.1 ──
## ✔ ggplot2 3.2.1     ✔ purrr   0.3.2
## ✔ tibble  2.1.3     ✔ dplyr   0.8.3
## ✔ tidyr   1.0.0     ✔ stringr 1.4.0
## ✔ readr   1.3.1     ✔ forcats 0.4.0
## ── Conflicts ──────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
names(el_dist)
##  [1] "edo_min"                "nombre_distrito"       
##  [3] "cve_edo"                "cve_dtto"              
##  [5] "cve_edo_dtto"           "pan"                   
##  [7] "pri"                    "prd"                   
##  [9] "pvem"                   "pt"                    
## [11] "movimiento_ciudadano"   "nueva_alianza"         
## [13] "morena"                 "encuentro_social"      
## [15] "pan_prd_mc"             "pan_prd"               
## [17] "pan_mc"                 "prd_mc"                
## [19] "pri_pvem_na"            "pri_pvem"              
## [21] "pri_na"                 "pvem_na"               
## [23] "pt_morena_pes"          "pt_morena"             
## [25] "pt_pes"                 "morena_pes"            
## [27] "cand_ind_01"            "cand_ind_02"           
## [29] "cnr"                    "vn"                    
## [31] "total_votos_calculados" "lista_nominal_casilla" 
## [33] "v_meade"                "v_amlo"                
## [35] "v_anaya"                "v_bronco"              
## [37] "v_nulos_bis"            "v_validos"
v_bronco_edo <- el_dist %>% 
  group_by(edo_min) %>% 
  summarise(v_bronco_edo = sum(v_bronco, na.rm = TRUE)) %>% 
  ungroup() %>% 
  arrange(-v_bronco_edo)

v_bronco_edo
## # A tibble: 32 x 2
##    edo_min          v_bronco_edo
##    <fct>                   <int>
##  1 Estado de México       383612
##  2 Nuevo León             359816
##  3 Jalisco                246726
##  4 Guanajuato             223058
##  5 Ciudad de México       222994
##  6 Veracruz               132687
##  7 Chihuahua              132164
##  8 Michoacán              122353
##  9 Puebla                 113387
## 10 Tamaulipas             110167
## # … with 22 more rows

Segundo: Una vez que limpiamos la base, graficamos las barras.

?ggplot

# De la ayuda vemos que los argumentos son los siguientes:
# ggplot(data = NULL, mapping = aes(), ...,
#   environment = parent.frame())

ggplot(data = v_bronco_edo, mapping = aes(x = edo_min, y = v_bronco_edo)) + 
  geom_bar(stat = "identity")

# Aqui vemos que algo sucedio... 

Detalles de la gráfica:

  1. Esta toda gris.
  2. Tiene notacion científica.
  3. Los nombres de los ejes estan feos.
  4. Los nombres de los estados se estorban mucho.
  5. El fondo se ve feo.
  6. No se vería mejor si las barras estuvieran ordenadas de mayor a menor?

Muy observadores… procederemos a solucionar cada una de sus observaciones:

1. Esta toda gris.

Vamos a asignar un color a cada estado con los aesteticos. (Notemos que si no especificamos colores, se ponen unos por default).

# Codigo viejo
ggplot(data = v_bronco_edo, mapping = aes(x = edo_min, y = v_bronco_edo)) + 
  geom_bar(stat = "identity")

# Codigo nuevo
ggplot(data = v_bronco_edo, mapping = aes(x = edo_min, y = v_bronco_edo, 
                                          fill = edo_min)) + 
  geom_bar(stat = "identity")

2. Tiene notacion científica.

Esto se solucionaba con el options(scipen = 999) que se me olvidó poner al inicio.

options(scipen = 999)
# Codigo nuevo
ggplot(data = v_bronco_edo, mapping = aes(x = edo_min, y = v_bronco_edo, 
                                          fill = edo_min)) + 
  geom_bar(stat = "identity")

3. Los nombres de los ejes estan feos.

Esto se cambia sumandole una nueva capa de etiquetas, con la función labs de labels.

# Codigo viejo
ggplot(data = v_bronco_edo, mapping = aes(x = edo_min, y = v_bronco_edo, 
                                          fill = edo_min)) + 
  geom_bar(stat = "identity")

# Codigo nuevo (como ya es mucho codigo lo guardamos en un objeto)
plot <- ggplot(data = v_bronco_edo, mapping = aes(x = edo_min, y = v_bronco_edo, 
                                          fill = edo_min)) + 
  geom_bar(stat = "identity") +
  labs(title = "Votos del Bronco a nivel estado", 
       subtitle = "Elecciones para la presidencia nacional de México, 2018", x = "", 
       y = "Numero de votos", 
       caption = "Fuente: Datos de @segasi, por lo que son verdad"
       )

# Imprimimos la grafica
plot

4. Los nombres de los estados se estorban mucho.

Para solucionar esto, vamos a sumar una nueva capa de cambio de eje, con la función coord_flip().

plot + 
  coord_flip()

5. El fondo se ve feo.

Pues lo ponemos blanco. Para eso, le sumamos una capa de tema predeterminado (en este caso, fondo blanco con líneas grises codificado en theme_bw()).

# Le aniadimos un fondo blanco. 
plot + theme_bw()

6. No se vería mejor si las barras estuvieran ordenadas de mayor a menor?

Para esto, tendremos que rehacer la gráfica (este debió ser el primer cambio!!!)

# Grafica completa: 
plot_final <- ggplot(data = v_bronco_edo, 
       mapping = aes(x = reorder(edo_min, v_bronco_edo), 
                     y = v_bronco_edo, 
                     fill = edo_min)) + 
  geom_bar(stat = "identity") +
  labs(title = "Votos del Bronco a nivel estado", 
       subtitle = "Elecciones para la presidencia nacional de México, 2018",        x = "", 
       y = "Numero de votos", 
       caption = "Fuente: Datos de @segasi, por lo que son verdad"
       ) + 
  coord_flip() + 
  theme_bw()

plot_final

Otras preguntas siguientes que valdría la pena hacerse serían las siguientes:

  1. Podemos quitar esa molesta e invasiva escala?

  2. Podemos modificar el tipo de letra del título y subtítulo?

  3. Podemos personalizar los colores de las barras?

  4. Podemos ponerle unas comas a los numeros de los votos?

  5. Podemos hacer que si el usuario pasa el mouse por cada una de las barras, se despliegue una ventanita bonita?

Pues si, todo eso se puede con ggplot().

1. Podemos quitar esa molesta e invasiva escala?

2. Podemos modificar el tipo de letra del título y subtítulo?

Para esto utilizamos los temas

tema_juve <- theme_bw() + 
  theme(text = element_text(family = "Asap-Bold", color = "#25636e"), 
                                panel.grid.major = element_blank(),
                                panel.grid.minor = element_blank(), 
                                plot.caption=element_text(hjust=1,size=9,colour="grey30"),
                                plot.subtitle=element_text(face="italic",size=12,colour="grey40"),
                                plot.title=element_text(size=18,face="bold"),
                                axis.text.x = element_text(family = "Asap-Bold", color = "#25636e"),
                                axis.text.y = element_text(family = "Asap-Bold", color = "#25636e"), 
                                legend.position = "none")

plot_final + tema_juve

3. Podemos personalizar los colores de las barras?

Si!

ggplot(data = v_bronco_edo, 
       mapping = aes(x = reorder(edo_min, v_bronco_edo), 
                     y = v_bronco_edo, 
                     fill = edo_min)) + 
  geom_bar(stat = "identity", fill = c(rep("blue", 15), rep("red", 17))) +
  labs(title = "Votos del Bronco a nivel estado", 
       subtitle = "Elecciones para la presidencia nacional de México, 2018",        x = "", 
       y = "Numero de votos", 
       caption = "Fuente: Datos de @segasi, por lo que son verdad"
       ) + 
  coord_flip() + 
  theme_bw() + 
  tema_juve

4. Podemos ponerle unas comas a los numeros de los votos?

Si

ggplot(data = v_bronco_edo, 
       mapping = aes(x = reorder(edo_min, v_bronco_edo), 
                     y = v_bronco_edo, 
                     fill = edo_min)) + 
  geom_bar(stat = "identity", fill = c(rep("blue", 15), rep("red", 17))) +
  labs(title = "Votos del Bronco a nivel estado", 
       subtitle = "Elecciones para la presidencia nacional de México, 2018",        x = "", 
       y = "Numero de votos", 
       caption = "Fuente: Datos de @segasi, por lo que son verdad"
       ) + 
  coord_flip() + 
  theme_bw() + 
  tema_juve + 
  scale_y_continuous(labels = scales::dollar_format(prefix = "", suffix = " votos"), 
                     expand = c(0.02,0))

5. Podemos hacer que si el usuario pasa el mouse por cada una de las barras, se despliegue una ventanita bonita?

Obvio si, pero necesitamos un poco de ayuda de la libreria plotly

plot_fina_final <- ggplot(data = v_bronco_edo, 
       mapping = aes(x = reorder(edo_min, v_bronco_edo), 
                     y = v_bronco_edo, 
                     fill = edo_min)) + 
  geom_bar(stat = "identity", fill = c(rep("blue", 15), rep("red", 17))) +
  labs(title = "Votos del Bronco a nivel estado", 
       subtitle = "Elecciones para la presidencia nacional de México, 2018",        x = "", 
       y = "Numero de votos", 
       caption = "Fuente: Datos de @segasi, por lo que son verdad"
       ) + 
  coord_flip() + 
  theme_bw() + 
  tema_juve + 
  scale_y_continuous(labels = scales::dollar_format(prefix = "", suffix = " votos"), 
                     expand = c(0.02,0))

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
ggplotly(plot_fina_final)

Esto se puede modificar mas, pero por hoy, es suficiente.

Fin :)