1 Presentación

El presente documento contiene el solucionario a los ejercicios 3.9.1 del libro de R for Data Science de Hadley Wickham y Garrett Grolemund en su versión en español.

Este documento se realiza con fines académicos para el curso de Técnicas de Exploración de Datos de la carrera de Estadística e Informática de la Universidad Nacional Agraria La Molina de Lima, Perú.

2 Marco téorico

2.1 Sistema de coordenadas

Los sistemas de coordenadas son probablemente la parte más complicada de ggplot2. El sistema predeterminado es el sistema de coordenadas cartesianas, donde las posiciones x e y actúan independientemente para determinar la ubicación de cada punto. Hay varios otros sistemas de coordenadas que ocasionalmente son útiles

  • coord_flip() cambia los ejes x e y. Esto es útil, por ejemplo, si quieres diagramas de caja horizontales. También es útil para etiquetas largas: es difícil ajustarlas sin que se superpongan en el eje x.
ggplot(data = millas, mapping = aes(x = clase, y = autopista)) +
 geom_boxplot()

ggplot(data = millas, mapping = aes(x = clase, y = autopista)) +
 geom_boxplot() +
 coord_flip()

  • coord_quickmap() establece correctamente la relación de aspecto para los mapas. Esto es muy importante si gráficas datos espaciales con ggplot2 (tema para el que, desafortunadamente, no contamos con espacio para desarrollar en este libro).
nz <- map_data("nz")

ggplot(nz, aes(long, lat, group = group)) +
 geom_polygon(fill = "white", colour = "black")

ggplot(nz, aes(long, lat, group = group)) +
 geom_polygon(fill = "white", colour = "black") +
 coord_quickmap()

  • coord_polar() usa coordenadas polares. Las coordenadas polares revelan una conexión interesante entre un gráfico de barras y un gráfico de Coxcomb.
bar <- ggplot(data = diamantes) +
 geom_bar(
 mapping = aes(x = corte, fill = corte),
 show.legend = FALSE,
 width = 1
 ) +
 theme(aspect.ratio = 1) +
 labs(x = NULL, y = NULL)
bar + coord_flip()

bar + coord_polar()

3 Ejercicios

3.1 Convierte un gráfico de barras apiladas en un gráfico circular usando coord_polar().

millas <- datos::millas
head(millas) %>% flextable()

fabricante

modelo

cilindrada

anio

cilindros

transmision

traccion

ciudad

autopista

combustible

clase

audi

a4

1.8

1,999

4

auto(l5)

d

18

29

p

compacto

audi

a4

1.8

1,999

4

manual(m5)

d

21

29

p

compacto

audi

a4

2.0

2,008

4

manual(m6)

d

20

31

p

compacto

audi

a4

2.0

2,008

4

auto(av)

d

21

30

p

compacto

audi

a4

2.8

1,999

6

auto(l5)

d

16

26

p

compacto

audi

a4

2.8

1,999

6

manual(m5)

d

18

26

p

compacto

3.1.1 Gráfico de barras apiladas

Para este gráfico de barras apiladas queremos observar cuantos autos fueron fabricados en
dos mil ocho y de tracción en las 4 ruedas, teniendo en cuenta el fabricante y la clase.

millas %>%  filter(traccion == "4" & anio == 2008 & combustible == "p") %>% ggplot() + 
  aes(x = fabricante, fill = clase) + geom_bar()

3.1.2 Gráficos circulares

Para convertir este grafico de barras apiladas en un grafico circular tenemos que usar la
funcion coord_polar que está en el paquete de ggplot2.

3.1.2.1 Gráfico “Ojo de Buey” o Proyección polar X

Por defecto el argumento theta = "x" y nos da un gráfico que se conoce como “Ojo de Buey”.
Cuando el argumento es theta = "x", los valores del eje x se mapean a los ángulos en la
proyección polar, lo que hace que las barras (o marcadores) se extiendan radialmente según los
valores del eje x.

millas %>%  filter(traccion == "4" & anio == 2008 & combustible == "p") %>% 
  ggplot() + 
  aes(x = fabricante, fill = clase) + 
  geom_bar() +
  coord_polar()

3.1.2.2 Gráfico en Proyección polar Y

Cuando el argumento es theta = "y", los valores del eje y se mapean a los ángulos en la proyección polar,
lo que significa que la longitud de las barras (la distancia radial) se determina por los valores del eje y.

millas %>%  filter(traccion == "4" & anio == 2008 & combustible == "p") %>% 
  ggplot() + 
  aes(x = fabricante, fill = clase) + 
  geom_bar() +
  coord_polar(theta = "y")



3.2 ¿Qué hace labs()?

La función labs() en el paquete ggplot2 se utiliza para establecer etiquetas y leyendas en un gráfico.
Permite personalizar y añadir títulos a los ejes x e y, la leyenda de colores, el título del gráfico y
la leyenda general del gráfico. Es una forma conveniente de agregar metadatos descriptivos a un gráfico
creado con ggplot2.

En este ejemplo usaremos el código del Gráfico de barras apiladas

millas %>%  filter(traccion == "4" & anio == 2008 & combustible == "p") %>% ggplot() + 
  aes(x = fabricante, fill = clase) + geom_bar() +
  labs(title = "Distribución de clase de automóviles 
       por fabricante en 2008",                            # Le agregamos un título adecuado
       x = "Fabricante del auto",                          # Cambiamos el nombre del eje `x`
       y = "Número de autos",                              # Cambiamos el nombre del eje `y`
       fill = "Tipo de auto",                              # Cambiamos el nombre de la leyenda
       subtitle = "Estos autos solo tienen tracción en las 
       cuatro ruedas y combustible premium",               # le agremos un subtítulo
       caption = "fuente: http://fueleconomy.gov")         # le agregamos la fuente de donde se han proporcionado los datos

labs() no es la única función para agregar títulos. xlab(), ylab() y ggtitle() realizan la misma función.



3.3 ¿Cuál es la diferencia entre coord_map() y coord_quickmap()?

Coord_map y coord_quickmap son dos funciones que permiten proyectar mapas en entornos de
visualización en R, aunque difieren significativamente en términos de precisión y velocidad de cálculo.

3.3.1 Función Coord_map

coord_map ofrece una proyección precisa del mapa, aunque requiere un tiempo
de computación considerable. Su objetivo es aproximar la proyección lo máximo posible
para obtener representaciones cartográficas fieles a la realidad, siendo útil para áreas extensas o
cuando se necesita alta precisión espacial.

3.3.2 Función Coord_quickmap

Coord_quickmap ofrece una aproximación rápida para preservar líneas rectas en la visualización
del mapa, a diferencia de coord_map. Aunque menos precisa, coord_quickmap destaca por su velocidad
y eficiencia computacional, siendo útil para representar áreas pequeñas cercanas al ecuador donde la
preservación de líneas rectas es prioritaria sobre la precisión cartográfica.

Para este ejemplo vamos a usar el mapa del mundo que por defecto la proyección que usa es Mercator

mundo <- ggplot(map_data("world"),
       aes(long, lat, group = group)) +
  geom_polygon(fill = "white", color = 1) +
  labs(title = "Mapa del Mundo",
       x = "Longitud",
       y = "Latitud")
mundo

Vamos a usar el paquete tictoc, lo cual nos permitirá saber el tiempo que demora en ejecutarse el código.

3.3.3 Mapa y tiempo usando coord_map

tic()
mundo + coord_map(xlim = c(-180, 180))  # Hemos modificado los límites del eje X debido a que la función produce unas líneas horizontales no deseadas

toc() -> tc_map                         
## 1.47 sec elapsed

3.3.4 Mapa y tiempo usando coord_quickmap

tic()
mundo + coord_quickmap()

toc() -> tc_quickmap
## 0.72 sec elapsed

3.3.5 Comparativa de los mapas

grid.arrange(mundo + coord_map(xlim = c(-180, 180)), mundo + coord_quickmap(), ncol = 2)

Ejecutando los códigos podemos ver que cuando usamos la función coord_quickmap el tiempo de ejecución es 0.72 sec elapsed es menor al tiempo de ejecución de la función coord_map siendo 1.47 sec elapsed
pero las proporciones del mapa no son tan precisas.

3.3.6 Direfentes tipos de proyecciones

3.3.6.1 Proyección Van der grinten

mundo + coord_map(projection = "vandergrinten",
                  xlim = c(-180, 180))

3.3.6.2 Proyección Ortográfica

mundo + coord_map(projection = "orthographic")

3.3.6.3 Proyección Ojo de pez

mundo + coord_map(projection = "fisheye", 
                  n = 4)   # Índice de refracción

3.3.6.4 Proyección Sinusoidal

mundo + coord_map(projection = "sinusoidal",
                  xlim = c(-180, 180))

3.3.6.5 Proyección Cilíndrica

mundo + coord_map(projection = "cylindrical",
                  xlim = c(-180, 180))

3.3.6.6 Proyección Gall-Peters

mundo + coord_map(projection = "gall",
                  parameters = 45,
                  xlim = c(-180, 180))

podemos ver los diferentes tipos de proyecciones que hay ejecutando el siguiente código ?mapproj::mapproject

3.3.7 Ejemplo usando el mapa de Italia

3.3.7.1 Usaremos el mapa de Italia

italia <- map_data("italy") %>% ggplot() + aes(x = long, y = lat, group = group) +
  geom_polygon(fill = "white", color = "black")
italia

3.3.7.2 Arreglaremos las proporciones usando la funcion coord_quickmap

 italia_mej <- italia + coord_quickmap(expand = TRUE) # Si es FALSO, los límites se toman exactamente de los datos o de xlim/ylim.
italia_mej



3.4 ¿Qué te dice la gráfica siguiente sobre la relación entre la ciudad y la autopista?

ggplot(data = millas, mapping = aes(x = ciudad, y = autopista)) +
    geom_point()

Ya que la mayoría de los datos están por encima de esta línea, significa que la mayoría de los autos tienen un mejor rendimiento en autopista en comparación con su rendimiento en ciudad, gastan menos combustible en la autopista por milla recorrida.

3.5 ¿Por qué es coord_fixed importante? ¿Qué hace geom_abline?

coord_fixed se utiliza para garantizar que la relación entre las unidades en ambos ejes sea igual en un gráfico, lo que significa que una unidad en el eje x es igual a una unidad en el eje y en términos de la apariencia visual del gráfico. Es útil cuando se necesitan gráficos con una escala igual en ambos ejes, como en gráficos de dispersión donde las unidades en ambos ejes deben ser proporcionales entre sí.

geom_abline se utiliza para trazar líneas diagonales (líneas de regresión) en un gráfico. Es útil para visualizar relaciones lineales entre variables en un gráfico de dispersión o para agregar líneas de regresión a otros tipos de gráficos para resaltar tendencias o patrones en los datos.

ggplot(data = millas, mapping = aes(x = ciudad, y = autopista)) +
    geom_point() +
    geom_abline()

Si solo usamos la función geom_abline en el gráfico traza una linea diagonal pero las proporciones estan mal ajustadas, podemos interpretar erróneamente el gráfico.

ggplot(data = millas, mapping = aes(x = ciudad, y = autopista)) +
    geom_point() +
    geom_abline() +
    coord_fixed()

Ahora al agregar la función coord_fixed aseguramos que la línea que genera geom_abline tenga un ángulo de 45 grados. Esto facilita la comparación cuando los rendimientos en autopista y ciudad son iguales.

Podemos usar el paquete plotly para tener un gráfico mas interactivo

ca <- ggplot(data = millas, mapping = aes(x = ciudad, 
                                      y = autopista,
                                      color = fabricante)) + # Para saber el fabricante del auto
    geom_point() +
    geom_abline() +
    coord_fixed()
ggplotly(ca)

Ahora podemos ver la información de cada punto como por ejemplo cual es la cantidad de millas recorridas en autopista, en ciudad y cual es su fabricante.