Capítulo 7 Visualización de datos
7.1 Resumen
En este capítulo:
- Discutimos los tipos de gráficas apropiadas para distintos tipos de variables.
- Creamos varios tipos de gráficas usando la librería ggplot2
.
Principales conceptos: histograma, gráfica de dispersión, gráfica de barras.
Funciones clave: ggplot()
, aes()
, geom_*()
, scale_*_*
, labs()
, ggsave()
.
7.1.1 Librerías
Vamos a utilizar las siguientes librerías:
library(tidyverse)
library(gapminder) # datos para ejercicios
library(knitr) # tablas en RMarkdown
7.2 Visualización de datos con ggplot2
Visualizamos datos por muchas razones: análisis exploratorio, evaluación de modelos estadísticos y comunicación de resultados son algunas de las principales. El problema que buscamos resolver en este capítulo es “simple”: cómo hacer para transmitir información visualmente de forma efectiva. El objetivo es producir gráficos como este, que comunican información de forma efectiva:
La idea es poder identificar rápidamente el tipo de gráfica para el tipo de información que queremos visualizar y hacerlo de manera sencilla y efectiva.
7.2.1 ggplot2
: la gramática de los gráficos
La librería ggplot2
disfruta de una inmensa popularidad entre científicos de datos, politólogos, economistas, comunicadores, periodistas de datos y más. La lógica de ggplot2
está basado en la “gramática de los gráficos”: la idea básica es construir gráficas capa por capa, asignando propiedades de la gráfica a variables en nuestros datos.
Nuevamente, en ggplot2
, los gráficos se construyen por capas siguiendo una estructura:
- Seleccionamos datos y asignamos propiedades estéticas a variables usando las funciones base
ggplot()
yaes()
: asignamos variables a elementos como ejes, colores, rellenos, tamaños, formas, etc. - Agregamos capas de geometrías o formas usando
geom_
: así creamos puntos para una gráfica de dispersión, líneas para series de tiempo, barras para un histograma, líneas de tendencia, etc. - Cambiamos o agregamos escalas, títulos, ejes, leyendas, coordenadas, fondos, etc.
Así, el formato más básico y abstracto de una gráfica construida en ggplot2()
es:
%>%
datos ggplot(aes(x = variable_x, y = variable_y)) +
*(opciones...) geom_
En la práctica:
%>%
mpg ggplot(aes(displ, cty)) +
geom_point()
Y agregando más elementos:
%>%
datos ggplot(aes(x = variable_x, y = variable_y)) +
*(opciones...) +
geom_*(opciones...) +
scale_labs(x = "Etiqueta", y = "Otra etiqueta")
Y en la práctica:
%>%
mpg ggplot(aes(displ, cty, color = class)) +
geom_point(size = 2) +
scale_color_brewer(palette = "Dark2") +
labs(x = "Desplazamiento (en L)", y = "Millas por galón (ciudad)",
color = "Tipo de carro")
7.3 Principales tipos de gráficas
Existe un gráfico apropiado para el tipo de información que tenemos y que queremos visualizar. Aquí, distinguimos los tipos de gráficas según el número de variables que queremos incluir y su tipo (continua, ordinal, categórica). Por ejemplo, si queremos ver la relación entre dos variables continuas, la opción más evidente es utilizar una gráfica de dispersión. Mientras, si queremos ver la relación entre una continua y una categórica, un diagrama de barras es mejor.
7.3.1 Preparación de los datos
Para prepararnos, vamos a realizar algunas transformaciones y adiciones a la base de datos gapminder
. Recordemos la información que hay en esta:
gapminder
## # A tibble: 1,704 x 6
## country continent year lifeExp pop gdpPercap
## <fct> <fct> <int> <dbl> <int> <dbl>
## 1 Afghanistan Asia 1952 28.8 8425333 779.
## 2 Afghanistan Asia 1957 30.3 9240934 821.
## 3 Afghanistan Asia 1962 32.0 10267083 853.
## 4 Afghanistan Asia 1967 34.0 11537966 836.
## 5 Afghanistan Asia 1972 36.1 13079460 740.
## 6 Afghanistan Asia 1977 38.4 14880372 786.
## 7 Afghanistan Asia 1982 39.9 12881816 978.
## 8 Afghanistan Asia 1987 40.8 13867957 852.
## 9 Afghanistan Asia 1992 41.7 16317921 649.
## 10 Afghanistan Asia 1997 41.8 22227415 635.
## # ... with 1,694 more rows
Vamos a codificar una variable categórica para el nivel de ingreso de cada país-año con tres niveles: alto (por encima de la media del año + desv. est.), medio (por encima de la media del año, pero debajo de media + desv. est) y bajo (por debajo de la media del año). Usamos funciones que ya conocemos:
<- gapminder %>%
gapminder group_by(year) %>%
mutate(
gdpPercap_factor = case_when(
> mean(gdpPercap, na.rm = TRUE) + sd(gdpPercap, na.rm = TRUE) ~ "Alto",
gdpPercap <= mean(gdpPercap, na.rm = TRUE) + sd(gdpPercap, na.rm = TRUE) &
gdpPercap > mean(gdpPercap, na.rm = TRUE) ~ "Medio",
gdpPercap < mean(gdpPercap, na.rm = TRUE) ~ "Bajo"
gdpPercap
)
%>%
) ungroup()
También vamos a renombrar y reordenar niveles de otras variables categórica (pasar de inglés a español):
<- gapminder %>%
gapminder mutate(
continent = fct_recode(continent, "África" = "Africa",
"América" = "Americas", "Europa" = "Europe",
"Oceanía" = "Oceania"),
gdpPercap_factor = fct_relevel(gdpPercap_factor, "Bajo", after = Inf)
)
7.3.2 Gráficos de una variable: distribuciones
Visualizamos una variable cuando queremos mostrar la distribución de esta. En estos casos, no hay una segunda variable; el eje vertical es el número de observaciones (o proporción/porcentaje) que tienen cada valor de la variable que vemos en el eje horizontal. En ggplot2
, usamos geom_histogram()
, geom_density()
(variables continuas) o geom_bar()
(variables categóricas).
7.3.2.1 Una variable continua: histograma
Frecuentemente, lo primero que queremos ver es la distribución de una variable continua. En este caso, usamos geom_histogram()
para crear un histograma.
%>%
gapminder ggplot(aes(x = gdpPercap)) +
geom_histogram()
Como queremos que los títulos del ejes sean más informativos que los nombres de las variables/columnas en nuestra base de datos, agregamos la función labs()
para modificar etiquetas o títulos de ejes:
%>%
gapminder ggplot(aes(x = gdpPercap)) +
geom_histogram() +
labs(x = "PIB per cápita", y = "Número de observaciones")
Aquí, además, modificamos las etiquetas del eje horizontal con scale_x_continuous()
para que estén en dólares, apoyándonos en la librería scales
del tidyverse
:
%>%
gapminder ggplot(aes(x = gdpPercap)) +
geom_histogram() +
scale_x_continuous(labels = scales::dollar) +
labs(x = "PIB per cápita", y = "Número de observaciones")
Variables como el PIB per cápita y la población de países con frecuencia presentan distribuciones sesgadas hacia la derecha (right-skewed). Podemos “normalizar” estas variables (mover la distribución un poco) calculando el logaritmo de las mismas. scale_x_log10()
nos permite transformar una variable continua -en este caso, aplicando un logaritmo base 10- sin tocar el dato subyacente. La función análoga scale_y_log10()
aplica si la variable que queremos transformar está en el eje vertical. El resultado es visualmente distinto, pero comparemos las etiquetas del eje horizontal:
%>%
gapminder ggplot(aes(x = gdpPercap)) +
geom_histogram() +
scale_x_log10(labels = scales::dollar) +
labs(x = "PIB per cápita", y = "Número de observaciones")
7.3.2.2 Una variable continua: densidad
Otra forma de visualizar la distribución de una variable continua es mirando su densidad con geom_density()
:
%>%
gapminder ggplot(aes(x = gdpPercap)) +
geom_density(alpha = 0.5) +
scale_x_continuous(labels = scales::dollar) +
labs(x = "PIB per cápita", y = "Densidad")
7.3.2.3 Una variable ordinal: barras
Si queremos ver la distribución de una variable ordinal (categorías ordenadas o números enteros con un rango reducido, tipo 1-7), podemos hacerlo con un gráfico de barras creado con geom_col()
. Este tipo de gráfica nos dice cuántas observaciones hay en cada grupo o categoría - en otras palabras, es una versión gráfica de una tabla de frecuencias:
%>%
gapminder ggplot(aes(x = gdpPercap_factor)) +
geom_bar() +
labs(x = "Nivel de ingreso", y = "Número de observaciones")
Cuando usamos “geometrías” con rellenos (como estas barras y las que producimos con geom_histogram()
) podemos cambiar el color en la función geom_bar()
:
%>%
gapminder ggplot(aes(x = gdpPercap_factor)) +
geom_bar(fill = "darkblue") +
labs(x = "Nivel de ingreso", y = "Número de observaciones")
7.3.2.4 Una variable categórica: barras
Si no hay orden en las categorías, igual usamos geom_bar()
para ver la distribución de una variable categórica.
%>%
gapminder ggplot(aes(x = continent)) +
geom_bar() +
labs(x = "Continente", y = "Número de observaciones")
Si creemos que el nombre de la variable que estamos visualizando es obvio (lo podemos inferir de las etiquetas o valores), podemos eliminar el título del eje en labs()
usando el valor NULL
:
%>%
gapminder ggplot(aes(x = continent)) +
geom_bar() +
labs(x = NULL, y = "Número de observaciones")
Podemos darle orden según el número de observaciones en cada categoría (o sea, según su frecuencia en los datos) con fct_infreq()
. Si, además, las etiquetas del eje horizontal son muy largas, podemos cambiar los ejes en aes()
:
%>%
gapminder ggplot(aes(y = fct_infreq(continent))) +
geom_bar() +
labs(y = NULL, x = "Número de observaciones")
Posiblemente queremos que las categorías más frecuentes estén de primero; para esto, usamos fct_rev()
para invertir el orden:
%>%
gapminder ggplot(aes(y = fct_rev(fct_infreq(continent)))) +
geom_bar() +
labs(y = NULL, x = "Número de observaciones")
7.3.2.5 Una variable categórica: barras (prop.)
Puede que busquemos lo mismo (ver frecuencias y la distribución de una variable categórica), pero con proporciones en vez de números absolutos. Entonces, añadimos algunas propiedas a geom_bar()
. También podemos cambiar las etiquetas a porcentajes:
%>%
gapminder ggplot(aes(x = continent)) +
geom_bar(aes(y = ..prop.., group = 1)) +
scale_y_continuous(labels = scales::percent) +
labs(x = NULL, y = "Porcentaje de observaciones")
7.3.3 Gráficos de dos variables: relaciones y comparaciones
Graficamos dos variables para explorar la relación entre ellas. Esto nos permite entrever si hay correlaciones o si existen diferencias importantes entre grupos. En ggplot2
, usamos geom_point()
(continua-continua) y geom_col()
(categórica-categórica), y geom_boxplot()
o geom_line()
(continua-categórica).
7.3.3.1 Dos variables continuas: dispersión
Junto a las gráficas de barras, los gráficos de dispersión para ver relaciones entre variables continuas son los más comúnes tanto para análisis exploratorio de datos, como en la comunicación de información y el periodismo de datos. Los construimos con geom_point()
, especificando variables en ambos ejes. Por convención, la variable explicativa (independiente) va en el eje horizontal. Aquí agregamos títulos y modificamos las etiquetas:
%>%
gapminder ggplot(aes(x = gdpPercap, y = lifeExp)) +
geom_point() +
scale_x_continuous(labels = scales::dollar) +
labs(x = "PIB per cápita", y = "Expectativa de vida al nacer")
Como la relación parece no es estrictamente lineal, cambiamos el eje a una escala logarítmica. Si hay muchos puntos que se traslapan, modificamos la transparencia de los mismos con el argumento alpha =
:
%>%
gapminder ggplot(aes(x = gdpPercap, y = lifeExp)) +
geom_point(alpha = 0.5) +
scale_x_log10(labels = scales::dollar) +
labs(x = "PIB per cápita", y = "Expectativa de vida al nacer")
Agregamos una línea de tendencia con geom_smooth()
(aquí, una regresión lineal simple cuando especificamos method = "lm"
):
%>%
gapminder ggplot(aes(x = gdpPercap, y = lifeExp)) +
geom_point(alpha = 0.5) +
geom_smooth(method = "lm", color = "grey50") +
scale_x_log10(labels = scales::dollar) +
labs(x = "PIB per cápita", y = "Expectativa de vida al nacer")
7.3.3.2 Dos variables categóricas: barras y cuentas
¿Qué tal si queremos visualizar la relación entre dos variables categóricas con una gráfica? La primera opción es hacer un diagrama de barras apiladas que nos permite ver las frecuencias de los grupos:
%>%
gapminder ggplot(aes(x = continent, fill = gdpPercap_factor)) +
geom_bar() +
labs(x = "Continente", fill = "Nivel de ingreso")
Sin embargo, es difícil comparar entre barras. Una gráfica de barras apiladas, pero con porcentajes en vez de frecuencias, puede ayudar. Especificamos el argumento position = "fill"
y ahora las categorías dentro de cada barra suman \(100\%\):
%>%
gapminder ggplot(aes(x = continent, fill = gdpPercap_factor)) +
geom_bar(position = "fill") +
scale_y_continuous(labels = scales::percent) +
labs(x = "Continente", fill = "Nivel de ingreso")
En cambio, si queremos barras agrupadas (una al lado de la otra) y no apiladas, especificamos el argumento position = "dodge"
. Con un número pequeño de categorías (4 o menos), esto puede ser más efectivo que las barras apiladas. Veamos:
%>%
gapminder ggplot(aes(x = continent, fill = gdpPercap_factor)) +
geom_bar(position = "dodge") +
labs(x = "Continente", fill = "Nivel de ingreso")
Otra alternativa para ver relaciones entre variables categóricas es usar geom_count()
. Es enteramente posible en ggplot2
, pero los resultados no son los mejores visualmente. Aquí vemos un ejemplo - como el título de la leyenda de tamaño es muy largo, lo dividimos en dos líneas usando \n
:
%>%
gapminder ggplot(aes(x = continent, y = gdpPercap_factor)) +
geom_count() +
labs(x = "Continente", y = "Nivel de ingreso", size = "Número de \nobservaciones")
Es preferible hacer tablas cruzadas para este tipo de información. Si queremos imprimirla, podemos usar kable()
de knitr
, junto a un poco de magia de tidyr
:
library(knitr)
%>%
gapminder group_by(continent, gdpPercap_factor)%>%
summarise(casos = n()) %>%
ungroup() %>%
pivot_wider(names_from = "continent", values_from = "casos") %>%
kable(
caption = "Tabulación cruzada de continentes y nivel de ingreso",
col.names = c("Nivel de ingreso", "África", "América", "Asia", "Europa", "Oceanía")
)
Nivel de ingreso | África | América | Asia | Europa | Oceanía |
---|---|---|---|---|---|
Alto | 5 | 22 | 57 | 124 | 16 |
Medio | 27 | 68 | 59 | 170 | 8 |
Bajo | 592 | 210 | 280 | 66 | NA |
7.3.3.3 Dos variables: una continua, una categórica
Para comparar distribuciones o estadísticas resumen de una variable continua en dos o más grupos. Esto es esencial para evaluar hipótesis sobre la diferencia entre grupos (por ejemplo, control y tratamiento).
7.3.3.3.1 Una cont., una cat.: histogramas por grupo
Comparamos la distribución de una variable continua en dos o más grupos (definidos por una variable categórica u ordinal). Agregamos group =
a la función aes()
, junto con facet_wrap()
:
%>%
gapminder ggplot(aes(x = gdpPercap, group = continent)) +
geom_histogram() +
facet_wrap(~ continent) +
scale_x_log10(labels = scales::dollar) +
labs(x = "PIB per cápita", y = "Número de observaciones")
7.3.3.3.2 Una cont., una cat.: barras
En contraste, quizás queremos ver una estadística de una variable para cada grupo con el fin de realizar una comparación. Por ejemplo, la media de una variable numérica, no en general para toda la muestra, sino por grupos definidos por una variable categórica. Comparar medias de grupos es uno de los elementos centrales en la estadística aplicada en ciencias sociales.
Hacemos uso de group_by()
y summarize()
primero para encontrar la media de cada grupo y luego usamos geom_col()
:
%>%
gapminder group_by(continent) %>%
summarize(gdpPercap = mean(gdpPercap, na.rm = TRUE)) %>%
ggplot(aes(x = continent, y = gdpPercap)) +
geom_col() +
scale_y_continuous(labels = scales::dollar) +
labs(x = NULL, y = "PIB per cápita")
Las funciones fct_reorder()
para organizar las categorías según la media de la variable numérica y coord_flip()
para girar el eje nos permiten organizar mejor la gráfica:
%>%
gapminder group_by(continent) %>%
summarize(gdpPercap = mean(gdpPercap, na.rm = TRUE)) %>%
ggplot(aes(y = fct_reorder(continent, gdpPercap), x = gdpPercap)) +
geom_col() +
scale_x_continuous(labels = scales::dollar) +
labs(y = NULL, x = "PIB per cápita")
Sin embargo, este tipo de gráficas ignoran la dispersión de los datos. Vamos a agregar errores estándar usamod geom_errorbar()
, recordando que debemos calcular estos errores primero. Utilizamos varios argumentos de geom_errorbar()
para mejorar la apariencia de la gráfica:
%>%
gapminder group_by(continent) %>%
summarize(
media = mean(gdpPercap, na.rm = TRUE),
error = sd(gdpPercap, na.rm = TRUE)/sqrt(n())
%>%
) ggplot(aes(x = fct_rev(fct_reorder(continent, media)), y = media)) +
geom_col(fill = "grey80") +
geom_errorbar(aes(ymin = media-error, ymax = media+error),
color = "blue", width = 0.2) +
scale_y_continuous(labels = scales::dollar) +
labs(x = NULL, y = "PIB per cápita")
Por otro lado, si queremos ver un solo valor (no un resumen, como la media), geom_col()
también nos permite hacerlo:
%>%
gapminder filter(year == 2007) %>% # solo un año
top_n(20, gdpPercap) %>% # solo las 20 observaciones con mayor PIB per capita
ggplot(aes(y = fct_reorder(country, gdpPercap), x = gdpPercap)) +
geom_col() +
scale_x_continuous(labels = scales::dollar) +
labs(y = NULL, x = "PIB per cápita")
7.3.3.3.3 Una cont., una cat.: cajas
Los diagramas de cajas y bigotes (geom_boxplot()
) nos permiten ver la media, el rango intercuartil y los outliers para cada grupo:
%>%
gapminder ggplot(aes(x = continent, y = gdpPercap)) +
geom_boxplot() +
scale_y_log10(labels = scales::dollar) +
coord_flip() +
labs(x = NULL, y = "PIB per cápita")
Como alternativa, pueden crear diagramas de violín con geom_violin()
:
%>%
gapminder ggplot(aes(x = continent, y = gdpPercap)) +
geom_violin() +
scale_y_log10(labels = scales::dollar) +
labs(x = NULL, y = "PIB per cápita")
Podemos agregar colores y eliminar la leyenda del relleno con guides()
, que es redundante en este caso:
%>%
gapminder ggplot(aes(x = continent, y = gdpPercap, fill = continent)) +
geom_violin(alpha = 0.5) +
scale_y_log10(labels = scales::dollar) +
scale_fill_discrete() +
guides(fill = FALSE) +
labs(x = NULL, y = "PIB per cápita")
7.3.3.3.4 Una cont., una ord.: series de tiempo
Si tenemos una dimensión temporal (observamos una o varias unidades en múltiples periodos, como en paneles con países-año), pasamos a utilizar geom_line()
:
%>%
gapminder filter(country == "Colombia") %>%
ggplot(aes(x = year, y = gdpPercap)) +
geom_line() +
scale_y_continuous(labels = scales::dollar) +
labs(x = "Año", y = "PIB per cápita")
Usamos group_by()
y summarize()
para agregar muchas observaciones que ocurren un mismo año. Además, usamos scale_x_continuous()
y el argumento breaks =
para modificar las etiquetas del eje horizontal:
%>%
gapminder group_by(year) %>%
summarize(gdpPercap = mean(gdpPercap, na.rm = TRUE)) %>%
ggplot(aes(x = year, y = gdpPercap)) +
geom_line() +
scale_y_continuous(labels = scales::dollar) +
scale_x_continuous(breaks = seq(1952, 2007, by = 5)) +
labs(x = "Año", y = "PIB per cápita promedio")
7.3.4 Gráficos de tres variables: interacciones o moderación
Construimos gráficas con tres variables para mostrar la interacción entre dos variables en relación con una tercera o mostrar cómo una modera la relación entre las otras. Está en el límite de lo que es fácil de comunicar visualmente. En ggplot2
, usamos geom_point()
, geom_col()
y, a veces, geom_line()
.
7.3.4.1 Tres continuas
Usando el argumento color =
en la función aes()
, construimos una gráfica de dispersión, con colores para una tercera variable continua:
%>%
gapminder mutate(log_pop = log(pop)) %>%
ggplot(aes(x = gdpPercap, y = lifeExp, color = log_pop)) +
geom_point() +
scale_x_log10(labels = scales::dollar) +
labs(x = "PIB per cápita", y = "Expectativa de vida al nacer", color = "Población (log.)")
7.3.4.2 Dos cont., una cat.
Veamos una gráfica de dispersión, pero queremos que una variable categórica esté representada por el color de cada punto:
%>%
gapminder ggplot(aes(x = gdpPercap, y = lifeExp, color = continent)) +
geom_point(alpha = 0.35) +
scale_x_log10(labels = scales::dollar) +
labs(x = "PIB per cápita", y = "Expectativa de vida al nacer", color = "Continente")
7.3.4.3 Una cont., dos cat.: barras agrupadas
En otras ocasiones, tenemos dos variables categóricas y queremos comparar cómo varía una tercera variable numérica en los grupos dados por la combinación de las dos categóricas. Usar geom_col()
con el argumento position = "dodge"
nos permite poner las barras una al lado de la otra para facilitar la comparación y hacer un diagrama de barras agrupadas:
%>%
gapminder group_by(continent, gdpPercap_factor) %>%
summarize(
media = mean(lifeExp, na.rm = TRUE)
%>%
) ggplot(aes(x = continent, y = media, fill = gdpPercap_factor)) +
geom_col(position = "dodge") +
labs(x = "", y = "Expectativa de vida al nacer", fill = "Nivel de ingreso")
## `summarise()` has grouped output by 'continent'. You can override using the `.groups` argument.
7.3.4.4 Una cont., una ord., una cat.: serie de tiempo
Queremos ver una serie de tiempo, pero con una línea para cada grupo (definido por una variable categórica).
%>%
gapminder filter(country %in% c("Colombia", "Brazil", "Mexico", "Argentina", "Venezuela")) %>%
group_by(year, country) %>%
summarize(gddPercap = mean(gdpPercap, na.rm = TRUE)) %>%
ggplot(aes(x = year, y = gddPercap, color = country)) +
geom_line() +
scale_y_continuous(labels = scales::dollar) +
scale_x_continuous(breaks = seq(1952, 2007, by = 5)) +
labs(x = "Año", y = "PIB per cápita", color = "País")
## `summarise()` has grouped output by 'year'. You can override using the `.groups` argument.
O usamos facet_wrap()
:
%>%
gapminder ggplot(aes(x = year, y = gdpPercap)) +
geom_line(aes(group = country), alpha = 0.5) +
scale_y_log10(labels = scales::dollar) +
facet_wrap(~ continent, ncol = 3) +
labs(x = "Año", y = "PIB per cápita")
7.3.5 Guardar objetos gráficos
Para guardar una gráfica como archivo (puede ser con extensión .png
, .pdf
u otras) usamos ggsave()
al final de la gráfica:
%>%
gapminder ggplot(aes(x = gdpPercap, y = lifeExp)) +
geom_point() +
scale_x_log10() +
ggsave("output/graf_disp.png")
7.3.5.1 Temas y diseño
Podemos cambiar elementos individuales del tema de una gráfica dentro de la función theme()
. Por ejemplo, la posición de la leyenda o el tamaño de la letra de los títulos:
%>%
mpg ggplot(aes(displ, cty, color = factor(cyl))) +
geom_point(size = 2) +
theme(
legend.position = "bottom", ## mover la leyenda
title = element_text(size = 20) ## aumentar el tamaño de la letra de todos los títulos
)
Hay temas que modifican muchos de los elementos de diseño de una gráfica, especialmente el fondo. Podemos cambiar el tema para una sola gráfica:
%>%
mpg ggplot(aes(displ, cty, color = factor(cyl))) +
geom_point(size = 2) +
theme_dark()
O por ejemplo:
%>%
mpg ggplot(aes(displ, cty, color = factor(cyl))) +
geom_point(size = 2) +
theme_minimal()
Si vamos a realizar muchas gráficas y queremos que todas tengan el mismo estilo, podemos utilizar la función set_theme()
al inicio de un R script o RMarkdown:
theme_set(
theme_classic(
base_size = 12, ## cambiar tamaño de letra base
+
) theme(legend.position = "bottom") ## agregar otros elementos
)
Todas las gráficas creadas después de ejecutar set_theme()
usarán estos elementos de diseño, sin tener que declararlo, a menos que especifiquemos lo contrario para una gráfica específica:
%>%
mpg ggplot(aes(displ, cty, color = factor(cyl))) +
geom_point(size = 2) +
labs(
x = "Desplazamiento del motor (en L)", y = "Millas por galón (ciudad)",
color = "Cilindros", title = "Para ahorrar, busque un motor pequeño",
subtitle = "Desplazamiento, eficiencia y cilindros de 234 autos", caption = "Fuente: EPA."
)
7.4 Buenas prácticas
Unos últimos comentarios sobre buenas prácticas a la hora de visualizar datos:
- La pregunta y la teoría mandan: ¿cómo me ayuda la gráfica a evaluar o dar soporte a un argumento?
- Variable dependiente: eje vertical; variable independiente: eje horizontal
- Excepciones: histogramas (¡solo hay una variable!) o cuando las etiquetas quedan mejor en el eje vertical (texto, como nombres de países o ciudades).
- Menos es más: ¿de verdad necesito usar colores para cada barra si ya hay etiquetas en los ejes (redundancia)? ¿Estoy seguro que quiero mostrar 6 variables (x, y, z, color, tamaño y forma de los puntos) en una sola gráfica? Probablemente no…
- Siempre hay que incluir títulos o etiquetas para los ejes y las leyendas (a menos que sea absolutamente evidente qué información transmiten).
- Título y pie de gráfica pueden ir en la gráfica o en el texto.
- A veces es mejor usar tablas, en particular cuando queremos ver frecuencias.
Hay muchas más formas de personalizar las gráficas:
- Utilizar
annotate()
ygeom_text()
para anotar gráficas. - Cambiar temas/fondos al agregar
theme_classic()
(u otras funcionestheme_()
) al final de una gráfica o cambiando el tema para todas las gráficas contheme_set()
. - Usar otras paletas de colores:
scale_color_brewer()
yscale_fill_brewer()
ofrecen varias alternativas para cmbiar los colores y rellenos.
7.5 Taller: visualización de datos
Encontrar una base de datos relevante para el proyecto de investigación. Limpiar y ordenar los datos. El código de esta entrega no debe incluir todo el procedimiento para cargar la base de datos original y el proceso de limpieza y organización de la misma; solo el resultado final de este proceso.
7.5.1 Distribuciones
Crear una gráfica de frecuencias (para variables categóricas) o un histograma (para variables continuas) que muestre la distribución de la variable dependiente del proyecto.
La gráfica debe tener ejes claramente titulados, contar con un título descriptivo y debe especificar la fuente de los datos (1.0 punto).
- Bono: Si la variable dependiente es continua y no está distribuida aproximadamente normal, transformar de forma tal que lo sea y graficar también la distribución de esta nueva variable.
7.5.2 Comparar distribuciones
Crear una gráfica de barras (para variables categóricas) o un histograma (para variables continuas) que compare la distribución de la variable dependiente del proyecto a través de dos o más grupos (o sea, otra variable categórica u ordinal). La variable graficada y los grupos deben ser de interés teórico y empírico en el marco de la pregunta de investigación. Solo deben comparar a través de países, municipios, regiones u otras unidades territoriales si hay una justificación teórica. No es tremendamente interesante comparar continentes o países si nuestra teoría es sobre diferencias políticas, institucionales o económicas. En cambio, es mucho más interesante comparar entre casos con o sin guerra; entre democracias, semidemocracias y autocracias; o entre casos con distintos modelos de desarrollo.
La gráfica debe tener ejes claramente titulados, contar con un título descriptivo y debe especificar la fuente de los datos (1.0 punto).
7.5.3 Relaciones entre variables
Crear una gráfica de dispersión en el cual se presente la relación entre dos variables continuas/numéricas de interés teórico. Solamente deben incluir una tercera variable –colores, tamaños de los puntos, etc.– si tiene sentido teóricamente, esto es, si su teoría sugiere que la tercera variable interactúa con otra o modera su efecto.
Aplican los mismos criterios y recomendaciones de los puntos anteriores (1.0 punto).
7.5.4 Medias de grupos
Crear una gráfica en la cual se compare la media de una variable numérica a través de dos o más grupos (o sea, una variable categórica u ordinal) de interés teórico. Varios tipos de gráficas pueden cumplir con este objetivo.
Aplican los mismos criterios y recomendaciones de los puntos anteriores (1.0 punto).
7.5.5 Interpretación
Ofrecer una interpretación corta de las gráficas (máximo 2-3 oraciones por gráfica) en términos de la pregunta de investigación y cómo estas visualizaciones ayudan a evaluar hipótesis o explorar aspectos interesantes de los datos (1.0 punto).
- Bono: en caso de tener datos en panel o serie de tiempo (o sea, múltiples observaciones de uno o más casos en periodos \(t_1, t_2, t_3, ..., t_n\)), visualizar dicha serie de tiempo para una variable numérica, con una línea por grupo (si hay distintos grupos relevantes). Aplican los mismos criterios y recomendaciones de los puntos anteriores.