Mejorando la apariencia de histogramas en ggplot2 de R
Mejorando la apariencia de un histograma en ggplot2
varios trucos
Julio César Alonso
Departamento de Economía - Universidad Icesijcalonso@icesi.edu.co
2021-03-02
1 Introducción
Este archivo presenta unos trucos para mejorar la apariencia de un histograma construido con ggplot2
.
Veremos:
- cómo incluir una linea para la media o para la mediana de la muestra.
- cómo incluir una linea de la distribución normal con la media y desviación estándar de la muestra
- cómo construir un histograma para diferentes categorías de una segunda variable.
Emplearemos los datos de gapminder
.
library(gapminder)
Concentrémonos en armar un histograma de de la esperanza de vida al nacer (lifeExp) de los países para el año 2007. Y para hacer otros cruces, guardemos también la información del continente. Construyamos una base para estos datos. Esto se puede hacer empleando el core de R o el paquete dplyr
.
# usando el core de R
data.Pob1 <- gapminder[which(gapminder$year == 2007), c("lifeExp", "continent")]
# usando dplyr
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
data.Pob <- gapminder %>%
filter(year == 2007) %>%
select(lifeExp, continent)
Naturalmente, usted puede usar cualquiera de las dos opciones y no tiene que emplear las dos. Solo para chequear, asegurémonos que las dos bases si son iguales.
sum(data.Pob1 == data.Pob)
## [1] 284
Es decir las 142 observaciones son iguales en las dos variables (\(142 \times 2 = 284\)) en ambas bases. Lo que esperábamos.
Ahora construyamos el histograma básico.
library(ggplot2)
pp1 <- ggplot(data.Pob, aes(x = lifeExp)) +
geom_histogram(aes( y = ..density..), bins = 50)
pp1
Ahora empecemos a mejorar el histograma.
2 Títulos, rótulos y fondo
Empecemos con cambiar el título y los rótulos. Así mismo cambiemos el fondo empleando el tema minimalista.
pp <- pp1 + labs(title = "Distribución relativa de la esperanza de vida al nacer por país en 2007",
subtitle = "(probabilidad 0-1)",
caption = "Fuente: paquete gapminder.",
tag = "Figura 1",
x = "edad",
y = "Probabilidad") +
theme_minimal()
3 Incluir linea de distribución normal
Ahora, incluyamos una linea que muestre cómo sería una distribución normal que tuviese la misma media y desviación estándar que la muestra.
pp <- pp + stat_function(fun = dnorm, colour = "red", args = list(mean = mean(data.Pob$lifeExp, na.rm = TRUE), sd = sd(data.Pob$lifeExp, na.rm = TRUE)))
pp
Mejores un poco la estética del gráfico.
pp <- pp + labs(title = "Distribución relativa de la esperanza de vida al nacer por país en 2007 (probabilidad 0-1)",
subtitle = "(distribución normal en rojo)",
caption = "Fuente: paquete gapminder.",
tag = "Figura 1",
x = "Edad",
y = "Probabilidad") + theme(plot.subtitle=element_text(size=8, hjust=0.5, face="italic", color="red"))
4 Incluir la media o mediana
Ahora incluyamos en el gráfico la media muestral y la mediana. Empecemos por la media.
pp <- pp1 + geom_vline(xintercept = mean(data.Pob$lifeExp, na.rm = TRUE), size = 0.5, colour = "red", linetype = "dashed")
Ahora agreguemos la mediana.
pp <- pp + geom_vline(xintercept = median(data.Pob$lifeExp, na.rm = TRUE), size = 0.5, colour = "blue", linetype = "dashed")
Y otra vez mejoremos la estética de la visualización.
pp <- pp + labs(title = "Distribución relativa de la esperanza de vida al nacer por país en 2007\n (probabilidad 0-1)",
subtitle = "(media en rojo, mediana en azul)",
caption = "Fuente: paquete gapminder.",
tag = "Figura 1",
x = "Edad",
y = "Probabilidad") +
theme_minimal() +
theme(plot.subtitle=element_text(size=8, hjust=0.5, face="italic"))
pp
5 Histogramas por categorías de unan segunda variable.
Ahora supongamos que queremos tener los histogramas para cada uno de los continentes. Pero todos en el mismo gráfico para poderlos comparar. Esto lo podemos hacer con la capas aes
y mapear al relleno la variable continente.
pp2 <- ggplot(data.Pob, aes(x = lifeExp, fill = continent)) +
geom_histogram(aes( y = ..density..), bins = 50)
pp2
Ahora, hagamos que las barras no se apilen.
pp2 <- ggplot(data.Pob, aes(x = lifeExp, fill = continent)) +
geom_histogram(aes( y = ..density..), bins = 30, position="identity", alpha=0.6)
pp2
y claro podemos mejorar la apariencia del gráfico. Por ejemplo,
pp2 <- pp2 + labs(title = "Distribución relativa de la esperanza de vida al nacer por continente men 2007 ",
subtitle = "(probabilidad 0-1)",
caption = "Fuente: paquete gapminder.",
tag = "Figura 1",
x = "Edad",
y = "Probabilidad",
fill = "Continente") +
theme_minimal() +
theme(plot.subtitle=element_text(size=8, hjust=0.5, face="italic")) + theme(legend.position = "bottom")
pp2
En algunas ocasiones este gráfico puede verse bien. Pero este no parce ser el caso. De pronto una mejor opción es usar facets
. Es decir,
pp2 <- pp2 +
facet_grid(. ~ continent, scales = "free")
pp2
Pero podría ser mejor cambiar la posición de los facets
pp2 <- pp2 +
facet_grid(continent ~ ., scales = "free")
pp2
y ahora, para hacer más fácil la comparación mantengamos la escala del eje y igual.
pp2 <- pp2 +
facet_grid(continent ~ .)
pp2
Comentarios
Publicar un comentario