library(readxl)

gapminder <- read_excel("gapminder.xlsx")

Sólo ggplot2

library(ggplot2)

Puedes cargar ggplot2 individualmente o junto con los paquetes del tidyverse. # Todo el tidyverse

library(tidyverse)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.1 ──
## ✓ tibble  3.1.1     ✓ dplyr   1.0.6
## ✓ tidyr   1.1.3     ✓ stringr 1.4.0
## ✓ readr   1.4.0     ✓ forcats 0.5.1
## ✓ purrr   0.3.4
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()

Componentes de la gramática En pocas palabras, la gramática de los gráficos nos quiere decir que:

Un gráfico estadístico es el mapeo de variables en nuestra data hacia atributos estéticos de figuras geométricas.

Podemos construir un gráfico a partir de tres componentes esenciales:

data: el set de datos que contiene las variables de interés geom: las figuras geométricas en cuestión. Nos referimos al tipo de objeto que podemos observar en un gráfico. Por ejemplo: puntos, líneas o barras. aes: los atributos estéticos de la figura geométrica. Por ejemplo, su posición en los ejes x/y, color, forma y tamaño. Los atributos estéticos son mapeados a las variables

Para mostrar lo simple que puede resultar graficar usando los componentes mencionados, usaremos datos del paquete gapminder. Para este primer ejemplo utilizaremos sólo los datos de expectativa de vida en Perú a lo largo de los años. Para ello crearemos df_ejemplo.

library(dplyr)

df_ejemplo <- gapminder %>% 
  select(country, year, lifeExp) %>% 
  filter(country == "Peru")

Ahora que tenemos df_ejemplo, sólo necesitamos usar dos líneas de código para ver la evolución de la expectativa de vida de los peruanos. Recuerda que para ello hemos cargado previamente ggplot2. ORDEN: Data, aes,geom. Siempre en aes el primer argumento es x y el otro eje y.

ggplot(data = df_ejemplo, mapping = aes(x = year, y = lifeExp)) +
  geom_line()

ggplot conciso Debido a que el primer argumento siempre será nuestra data, y en el mapeo de variables los dos primeros atributos siempre corresponden al eje X y al eje Y, podemos reescribir el código del gráfico anterior de forma más concisa.

ggplot(df_ejemplo, aes(year, lifeExp)) + 
  geom_line()

Puedo usar pipes No sólo eso. Recuerda que podemos usar el operador pipe para realizar una secuencia de pasos en nuestro análisis siempre y cuando el primer argumento de nuestra función requiera datos, como ocurre con ggplot. ¡Esto quiere decir que no era obligatorio crear primero df_ejemplo!

gapminder %>% 
  select(country, year, lifeExp) %>% 
  filter(country == "Peru") %>% 
  ggplot(aes(year, lifeExp)) + 
  geom_line()

¡Pero no te confíes! Date cuenta que para agregar elementos después de la función ggplot(), hacemos uso del operador de suma y no de pipes.

Puedo asignar mis gráficos a nombres

Los gráficos creados con ggplot() son un nuevo tipo de objeto. Como tal, puede usarse el operador de asignamiento para almacenarlos en nuestro Environment. Por ejemplo, creamos el objeto gráfico.

grafico <- gapminder %>% 
  select(country, year, lifeExp) %>% 
  filter(country == "Peru") %>% 
  ggplot(aes(year, lifeExp))

Ahora sólo haría falta agregarle una geometría.

grafico +
    geom_line()

grafico +
    geom_col()

grafico +
    geom_point()

¿Cómo determinar el correcto tipo de gráficos según los datos que tengo?

¿En qué casos debo usar columnas?¿En qué casos debo usar puntos?

Los cinco gráficos nombrados

Con el fin de conseguir una explicación simple, nos limitamos a mostrar cinco tipos de gráfico que son de uso común y que además permiten entender los usos de la gramática en su forma básica.

Gráfico de barras o columnas

El primer tipo de gráfico que veremos es el de barras. Resulta muy útil para mostrar la frecuencia de aparición de nuestros datos categóricos. Por ejemplo, podemos ver cuántos países encontramos por continente en las observaciones de gapminder correspondientes al año 2002. Podemos obtener esa información usando dplyr.

(paises_por_continente <- gapminder %>% 
  filter(year == 2002) %>% 
  group_by(continent) %>% 
  summarise(n = n()) %>% 
  ungroup() )
## # A tibble: 5 x 2
##   continent     n
##   <chr>     <int>
## 1 Africa       52
## 2 Americas     25
## 3 Asia         33
## 4 Europe       30
## 5 Oceania       2

Con esta información, podemos dibujar nuestro primer gráfico de barras haciendo uso de geom_col(). Usaremos el código anterior para no tener que crear un nuevo objeto.

paises_por_continente %>% 
  ggplot(aes(continent, n)) +
  geom_col()

Realizar un gráfico de barras con el recuento de observaciones según categorías es tan común, que ggplot2 incluye una función que nos evita tener que hacer el recuento manualmente. Esta vez crearemos el mismo gráfico usando geom_bar(), sin tener que hacer nuestro recuento primero.

gapminder %>% 
  filter(year == 2002) %>% 
  ggplot(aes(continent)) +
  geom_bar()

Geom_bar: solo pide x y en el y da recuento de observaciones (frecuencia) recuento, frecuencia Geom_col: lo que me pida que le ponga al eje y

#Gráfico de líneas

El siguiente tipo de gráfico ya lo conocemos. Consiste en líneas que nos sirven generalmente para analizar la evolución en el tiempo de determinadas variables. Debido a ello, es muy común mapear en el exe X alguna variable de tiempo, y en el eje Y alguna variable cuantitativa, que sería nuestra variable de interés.

Con gapminder podemos analizar la evolución del PBI per cápita peruano de 1952 a 2007. Para ello filtraremos sólo las observaciones pertenecientes a Perú. Para generar el gráfico de líneas usamos geom_line().

Si se usa línea, el eje x= fechas – con variables de fecha, las lineas son las que mejores para visualizar una serie de linea de tiempo. Barras: comparar valores entre ciertas categorías

gapminder %>% 
  filter(country == "Chile") %>% 
  ggplot(aes(year, gdpPercap)) +
  geom_line()

#Histogramas

Es posible hacer otro tipo de análisis usando una sola variable. El gráfico de barras nos mostraba cómo se distribuyen las observaciones de nuestras variables categóricas. Podemos esperar que exista un gráfico que nos muestre la distribución de variables numéricas.

Esto lo conseguimos con los histogramas.En lugar de mostrar la frecuencia de observaciones según categorías, nos permiten agrupar los datos por intervalos. Veamos cómo se distribuye el PBI per cápita de todos los países del mundo en el año 2007. Para generar el histograma usamos geom_histogram(). Por defecto, ggplot() divide nuestra data en 30 intervalos.

Usan una sola variable y es numerica Grafico de barras: eje x - variables categóricas. Barras permiten hacer comparaciones entre categorias Cada barra en un histograma representa un intervalo Da un recuento de observaciones para cada intervalo binds - cantidad del intervalo Recomendable: bins = 25

gapminder %>% 
  filter(year == 2007) %>% 
  ggplot(aes(gdpPercap)) +
  geom_histogram(bins=25)

#Diagramas de caja o boxplot

Otra manera de ver la distribución de nuestros valores es haciendo uso de diagramas de caja o boxplot. En este caso, es más entenderlo si primero hemos visto alguno. Para dibujarlo, usamos geom_boxplot().

Variable numérica, distribución Puntos: valores atípicos, valores extremos. Mientras más se acerca la mediana a la caja significa concentración o densidad. No se sabe la cantidad de países sino que el 25% concentra, ciertos valores donde la data se concentra o dispersa. linea gruesa: mediana y lo parte al 50% de los datos, cuartil mas pequeño, los datos se concentran ahi

gapminder %>% 
  filter(year == 2007) %>% 
  ggplot(aes(gdpPercap)) +
  geom_boxplot()

Habrás podido notar que además aparecen algunos puntos dibujados fuera de nuestros cuatro segmentos. Estos representan valores extremos, también conocidos como outliers. Pueden aparecer tanto en el lado más alto como en el más bajo de nuestros datos. Para determinar su existencia se utiliza un cálculo usando el Rango Intercuartil. Si no entiendes esta parte por ahora, no te preocupes, con que entiendas que son valores extremos es suficiente.

Algo muy útil que nos permiten hacer los boxplot es comparar la distribución de nuestros valores entre diferentes categorías. Por ejemplo, el PBI per cápita entre lo cinco continentes.

gapminder %>% 
  filter(year == 2007) %>% 
  ggplot(aes(gdpPercap, continent)) +
  geom_boxplot()

De esta manera, podemos ver que incluso los valores más altos de PBI en África no alcanzan a los valores medianos de Europa y Oceanía. También podemos ver que aunque Asia tiene países con valores de PBI per cápita comparables con los más altos de Europa, al menos la mitad de sus países se ubica en los niveles de África.

gapminder %>% 
  filter(year == 2007) %>% 
  ggplot(aes(lifeExp, continent)) +
  geom_boxplot()

Diagrama de dispersión

RR entre variables - previo para análisis de correlación (estadística inferencial - si cambian valores en VD)

Además de ver las características de una variable en particular, ya sea viendo su evolución en el tiempo o su distribución, podemos pensar en cómo analizar la relación entre nuestras variables. Por ejemplo, ¿qué relación existe entre el PBI per cápita y la expectativa de vida? Piensa un poco en esto y trata de responder la siguiente pregunta: ¿Existirá mayor expectativa de vida en países que tienen un PBI per cápita alto?

Para responder a esto podemos hacer uso de un diagrama de dispersión, también conocido como diagrama de puntos. Nos sirve para ver la relación existente entre dos variables, también conocida como correlación.

A continuación, analizaremos la relación entre el PBI per cápita y la expectativa de vida de todos los países en el año 2007. Para dibujar nuestro diagrama de puntos, hacemos uso de geom_point(). Las variables de interés van en cada uno de nuestros ejes. En este caso, como esperamos que el PBI per cápita influya en la epectativa de vida, lo colocamos en el eje X. Cada uno de los puntos de nuestro gráfico corresponde a un país.

gapminder %>% 
  filter(year == 2007) %>% 
  ggplot(aes(gdpPercap, lifeExp)) +
  geom_point()

Algo que podemos notar rápidamente es que existen gran cantidad de países con un PBI per cápita bajo, esto hace que haya mucha aglomeración en esa parte del gráfico. Aunque esto nos dificulta un poco el análisis, podemos ir respondiendo la siguiente pregunta: ¿La expectativa de vida en los países con mayor PBI per cápita es alta o baja?

Para ver la distribución en los países con menor PBI per cápita podemos filtrar sólo los valores menores a 10000.

gapminder %>% 
  filter(year == 2007, gdpPercap < 10000) %>% 
  ggplot(aes(gdpPercap, lifeExp)) +
  geom_point()

Nuevamente, podemos ver que los países con mayor PBI per cápita tienen la expectativa de vida más alta. Sin embargo, ahora además podemos ver con mayo claridad que aunque en los países con menor PBI per cápita la expectativa de vida es variada, generalmente se encuentra en los valores más bajos. Al parecer hay cierto umbral donde la expectativa de vida mejora.

Personalización de las geometrías

Hasta el momento hemos conocido cómo cambiar en nuestras geometrías los atributos estéticos de posición en los ejes X y Y. Sin embargo, cuando pensamos tradicionalmente en atributos estéticos, hay otro tipo de características que también nos vienen a la mente.

Tres de ellas pueden ser el color, tamaño y forma de las figuras geométricas que utilizamos en nuestros gráficos. Con ggplot2 podemos mapear alguna variable de nuestro set de datos a estos atributos.

#Color y relleno

Pensemos en un gráfico de barras. Habíamos visto que es posible crearlo usando geom_bar(). Por ejemplo, la cantidad de países en cada continente para el año 2007.

gapminder %>% 
  filter(year == 2007) %>% 
  ggplot(aes(continent)) +
  geom_bar()

El gráfico nos permite identificar una columna con cada uno de los continentes, pero para ello es necesario leer las etiquetas en el eje X. Otra manera de saber que estamos refiriéndonos a continentes distintos es haciendo uso del atributo fill, que se refiere al relleno de las barras.

gapminder %>% 
  filter(year == 2007) %>% 
  ggplot(aes(continent, fill = continent)) +
  geom_bar()

Vemos que además de colorear cada una de nuestras barras, ggplot2 automáticamente le agrega una leyenda a nuestro gráfico para saber qué categoría representa cada color mostrado. En un gráfico de barras, esta información ya la presentaban las etiquetas del eje X.

Para poder apreciar cómo el color nos puede apreciar a explotar nuestros datos, agreguémosle color de relleno a un diagrama de puntos. Recordemos que para ello hacemos uso de geom_point(). Por ejemplo, para ver la relación entre PBI per cápita y esperanza de vida en el año 2007. Haciendo uso del color, podemos ver cómo se posicionan los países según su continente.

gapminder %>% 
  filter(year == 2007) %>% 
  ggplot(aes(gdpPercap, lifeExp, color = continent)) +
  geom_point()

Podemos seguir viendo que existe una relación positiva entre PBI per cápita y expectativa de vida, pero además ahora podemos ver a qué continente pertecen los países con PBI per cápita más alto y más bajo.

Sin embargo, te habrás dado cuenta que para el código de barras hemos usado el argumento fill pero en el diagrama de puntos hemos usado color.

¿Por qué la diferencia? Tiene que ver con la figura geométrica que estamos utilizando. Por lo general debemos entenderlo de la siguiente manera:

fill: permite modificar el relleno de la figura. color: permite modificar los bordes o líneas de la figura.

gapminder %>% 
    filter(country %in% c("Peru", "Chile", "Colombia", "Mexico")) %>%
    ggplot(aes(year, gdpPercap, color = country)) +
    geom_line()

#Tamaño

Del mismo, usar el atributo de tamaño nos permite identificar nueva información acerca de nuestros datos. Por ejemplo, podemos ver la población de los países en nuestro diagrama de puntos para hacernos una idea de a quiénes representa. Para ello, usamos el argumento size y lo mapeamos a la variable pop.

gapminder %>% 
  filter(year == 2007) %>% 
  ggplot(aes(gdpPercap, lifeExp, size = pop)) +
  geom_point()

gapminder %>% 
  filter(year == 2007) %>% 
  ggplot(aes(gdpPercap, lifeExp, size = pop, color = continent)) +
  geom_point()

#Forma Debes tener en cuenta que no todo el mundo percibe los colores de la misma manera. En casos como esos, usar una forma distinta para nuestras categorías permite mostrar con mayor claridad las diferencias. Para ello, usamos el atributo shape.

gapminder %>% 
  filter(year == 2007) %>% 
  ggplot(aes(gdpPercap, lifeExp, shape = continent, color = continent)) +
  geom_point()

#Etiquetas

Por último, usar etiquetas significativas hará que nuestros gráficos hablen por sí solos. Para ello, agregamos la función labs() a nuestro gráfico. En ella, entre otras cosas, podemos modificar lo siguiente:

title: el título principal de nuestro gráfico subtitle: el subtítulo del gráfico caption: la nota al pie de nuestro gráfico x: la etiqueta del eje X y: la etiqueta del eje Y Conservamos grafico_puntos para usarlo como ejemplo.

grafico_dispersion <- gapminder %>% 
  filter(year == 2007) %>% 
  ggplot(aes(gdpPercap, lifeExp, shape = continent, color = continent)) +
  geom_point()
grafico_dispersion

#Usando labs() para títulos

grafico_dispersion +
  labs(title = "Relación entre PBI per cápita y expectativa de vida",
       subtitle = "Los cinco continentes en el año 2007")

grafico_dispersion +
  labs(x = "PBI per cápita",
       y = "Expectativa de Vida")

grafico_dispersion +
  labs(caption = "Fuente: Proyecto gapminder",
       color = "Continente", shape = "Continente")

Combinando todas las etiquetas Podemos juntar todas las etiquetas dentro de una misma llamada a labs(). De paso, guardamos grafico_final() para usarlo más adelante.

grafico_final <- grafico_dispersion +
  labs(title = "Relación entre PBI per cápita y expectativa de vida",
       subtitle = "Los cinco continentes en el año 2007",
       caption = "Fuente: Proyecto gapminder",
       x = "PBI per cápita",
       y = "Expectativa de Vida",
       color = "Continente",
       shape = "Continente")
grafico_final

#Temas (theme)

Los temas Es probable que además de cambiar los colores, forma y etiquetas de un gráfico, busques modificar otros elementos estéticos que no corresponden a datos.

Lamentablemente, escapa de la finalidad de esta sesión llegar a enseñarte esto. Sin embargo, ggplot2 viene con temas predefinidos que te pueden permitir ahorrarte el trabajo de hacerlos por ti mismo.

A continuación, algunos ejemplos de estos modelos aplicados a grafico_final.

library(ggplot2)
grafico_final +
    theme_bw()

grafico_final +
    theme_classic()

grafico_final +
    theme_light()

grafico_final +
    theme_minimal()

grafico_final +
    theme_void()

También existen otros paquetes que incluyen temas para gráficos. Uno de los más conocidos es ggthemes.

Para instalarlo.

Una vez instalado, no olvides llamarlo con library() para usar sus temas.

library(ggthemes)
grafico_final +
    theme_base()

grafico_final +
    theme_calc()

grafico_final +
    theme_clean()

grafico_final +
    theme_economist()

grafico_final +
    theme_wsj()

grafico_final +
    theme_stata()

Más allá de lo evidente Si deseas conocer más sobre ggplot2 puedes revisar su libro oficial y su “Cookbook” oficial.

Libro: Teoría y ejemplos claros Cookbook: Ejemplos extensivos