Gráficos

El discreto encanto de las animaciones

Representando datos, una animación es un gráfico en el que unas facetas (en terminología de ggplot2) ocultan el resto, como en

extraído de aquí y que representa la evolución del tamaño (superficie) de los coches habituales a lo largo del último siglo. Lo mismo pero evitando el indeseado efecto:

El código:

library(ggplot2)

datos <- structure(list(year = c(1930L,
  1950L, 1960L, 1970L,
  1980L, 1990L, 2000L, 2010L, 2018L),
  width = c(1.45, 1.59, 1.54, 1.56, 1.64,
           1.67, 1.75, 1.76, 1.78),
  length = c(3.38, 4.02, 3.96, 3.89, 3.98,
           4, 4.18, 4.12, 4.23)),
  class = "data.frame", row.names = c(NA, -9L))

ggplot(datos, aes(xmin = 0, ymin = 0,
  xmax = length, ymax = width)) +
  geom_rect() +
  coord_fixed() +
  facet_wrap(~ year) +
  xlab("longitud (m)") +
  ylab("anchura (m)") +
  ggtitle("Evolución de la superficie\ndel coche 'promedio'")

No son los picos, son los rangos

Me reencuentro con

tiempo después (fuente). Llaman la atención sobremanera los picos. Que no tienen otra razón de ser que un cambio en los rangos del eje horizontal.

Ahora la pregunta, de ejercicio: ¿cómo harías para representar esos datos para evitar esos artefactos (asumiendo escala lineal en el eje horizontal)?

Estructura poblacional de España: 2010-2050

Si se puede hacer para Japón, también se puede hacer para España:

El código,

library(idbr)
library(ggplot2)
library(animation)
library(ggthemes)

idb_api_key("pídela en https://www.census.gov/data/developers/data-sets/international-database.html")

male <- idb1('SP', 2010:2050, sex = 'male')
male$SEX <- "hombres"
male$POP <- -male$POP

female <- idb1('SP', 2010:2050, sex = 'female')
female$SEX <- "mujeres"

spain <- rbind(male, female)

saveGIF({

  for (i in 2010:2050) {

    title <- as.character(i)

    year_data <- spain[spain$time == i, ]

    g1 <- ggplot(year_data, aes(x = AGE, y = POP, fill = SEX, width = 1)) +
      coord_fixed() +
      coord_flip() +
      annotate('text', x = 98, y = -300000,
                label = 'Datos: US Census Bureau IDB; idbr R package', size = 3) +
      geom_bar(data = subset(year_data, SEX == "mujeres"), stat = "identity") +
      geom_bar(data = subset(year_data, SEX == "hombres"), stat = "identity") +
      scale_y_continuous(breaks = seq(-300000, 300000, 150000),
                          labels = paste0(as.character(c(seq(300, 0, -150), c(150, 300))), "k"),
                          limits = c(min(spain$POP), max(spain$POP))) +
      theme_economist(base_size = 14) +
      scale_fill_manual(values = c('#ff9896', '#d62728')) +
      ggtitle(paste0('Estructura poblacional de España en, ', title)) +
      ylab('Población') +
      xlab('Edad') +
      theme(legend.position = "bottom", legend.title = element_blank()) +
      guides(fill = guide_legend(reverse = TRUE))

    print(g1)

  }

}, movie.name = 'spain_pyramid.gif', interval = 0.1,
    ani.width = 700, ani.height = 600)

Diagramas de cajas: lo que hay que saber y muchas otras cosas que no hacen tanta falta pero que son entretenidas

Me sorprende averiguar que hay gente que no comprende el concepto de ruta (de ficheros) y la diferencia entre las relativas y las absolutas. Me sorprende igualmente tropezarme con gente a las que los diagramas de caja (boxplots, en bárbaro) no les resulten lo más natural del mundo. ¡Hayla!

Pero a veces nos equivocamos y nos da por pensar que siempre han estado ahí (¡no! son bastante recientes) y no se nos ocurre que haya quien pueda estar pensando en mejoras y extensiones. Para acrecentar nuestra culturilla estadística y ver cosas más o menos ocurrentes se están haciendo alrededor de los diagramas de caja, bien se puede leer 40 years of boxplots.

Micromapas

Vienen a ser la versión geo de las sparklines. Por ejemplo,

Notas:

  • El gráfico anterior no es mío. El código (y datos) con el que se generó tampoco. Son de Susana Huedo, exalumna.
  • Está basado (todo hay que decirlo) en código de terceros y debería acordarme de cuál de ellos. Pero no es el caso.

Cartuchos malbaratados

Me instan a hablar de

que procede de aquí y donde se compara el precio de una cerveza en la plaza mayor de las capitales de provincia españolas (a propósito, ¿cuál es la plaza mayor de Zaragoza o Soria?). Dejando el resto (casi todas, de hecho) de las cuestiones de lado, nos centraremos en el gráfico.

¿Qué nos dice la teoría sobre gráficos como este? Primero, que de entre todas las estéticas (usando la nomenclatura propia de ggplot2), las que mejor captura el ojo son x e y. Es decir, las distancias horizontales y verticales. Luego vienen el color, la pendiente, la forma, la transparencia, etc.

Me too, me too!

Las alturas corresponden a una cierta potencia de la población residente en la correspondiente rejilla. Los datos son del SEDAC (Socioeconomic Data and Applications Center, Universidad de Columbia) y se pueden bajar gratis si te registras y rellenas un cuestionario tontaina.

El código,

    library(ggplot2)
    options(expressions = 10000)

    dat <- read.table("dat/espp00ag.asc", skip = 6)
    dat <- as.matrix(dat)
    dat <- data.frame(y = as.numeric(row(dat)),
                      x = as.numeric(col(dat)),
                      pop = as.numeric(dat))

    peninsula <- dat[dat$x > 200,]
    peninsula <- peninsula[peninsula$y < 250,]

    res <- ggplot()

    for (i in 1:max(peninsula$y)){
      tmp <- peninsula[peninsula$y == i,]
      tmp$pop <- tmp$pop^0.3
      res <- res + geom_polygon(data = tmp, aes(x = x, y = pop - y), fill = "white", col = "black", size = 0.1)
      res <- res + geom_path(data = tmp, aes(x = x, y = pop - y), size = 0.2)
      res <- res + geom_hline(data = tmp, aes(yintercept = -y), col = "white")
    }

    res + theme(axis.line=element_blank(),
                axis.text.x=element_blank(),
                axis.text.y=element_blank(),
                axis.ticks=element_blank(),
                axis.title.x=element_blank(),
                axis.title.y=element_blank(),
                legend.position="none",
                panel.background=element_blank(),
                panel.border=element_blank(),
                panel.grid.major=element_blank(),
                panel.grid.minor=element_blank(),
                plot.background=element_blank())

Nota: se me olvidó escribir en el cuerpo lo que anunciaba el título, i.e., que esta entrada está inspirada (fusilada, de hecho) en lo esencial de otras previas.

Guadalajara joven, Guadalajara inconclusa

Continuando con mi serie sobre la Guadalajara demográfica,

que muestra la proporción de menores de 16 por municipio en la provincia.

No me habría atrevido a publicar nada tan en agraz si no fuese para dejar dos notas de potencial provecho para mis lectores. La primera que he usado los mapas que, dicen, son los de verdad de la buena. No los del INE, que son de amateur, sino los del SIANE del Instituto Geográfico Nacional, que me cuentan los que saben de la cosa que son los que se recomienda utilizar.

¿Podría fabricarse uno para España?

Me refiero a algo similar a (referencia):

Lo ideal sería crear una función compatible con el sistema de facetas de ggplot2 con nombre, p.e., facet_spain que permitiese disponer cualquier tipo de gráfico en una retícula similar.

No particularmente difícil, pero sí, seguro, utilísimo.

¿A nadie le tienta el proyecto?

[Me encanta el impersonal de “podría fabricarse…”. ¡Es como tan de tirar la piedra y esconder la mano!]

Las gráficas en la prensa (de allá)

La gráfica

muestra el número (manifiestamente creciente) de gráficas publicadas en una muestra de ejemplares del NYT (una quinquenal en un día laborable de septiembre) tal como se cuenta aquí.

¿Sería posible hacer un estudio similar con la prensa de aquí? Interesante, seguro, sí.

No soy yo, sos vos; repito, sos vos

Hoy he visto

grafico_ser

en una radio (sí, gráficos en una radio: el mundo está loco) y mi cabeza se ha puesto a dar vueltas, vueltas, vueltas, vueltas, vueltas, vueltas, vueltas, vueltas, vueltas, vueltas, vueltas, vueltas, vueltas, vueltas, vueltas, vueltas, vueltas, vueltas, vueltas, vueltas, vueltas, vueltas, vueltas, vueltas, vueltas, vueltas, vueltas, vueltas, vueltas, vueltas, vueltas, vueltas, vueltas, vueltas, vueltas, vueltas y más vueltas.

Hasta que me he dado cuenta de que no era yo, que era el gráfico.