Mejorando la apariencia de histogramas en ggplot2 de R

Mejorando la apariencia de un histograma en ggplot2

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

Entradas más populares de este blog

Creando Objetos de series de tiempo en R

Descargando e instalando a R y Rstudio