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)?

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.

¿Cómo está distribuida la renta? No, más bien, cómo son de grandes las provincias

El gráfico

ha estado dando vueltas por el ciberespacio. Lo vi en Twitter de mano de alguien que lo usaba para justificar que la distribución de la renta no es tan desigual en España al fin y al cabo. Está comentado desde el punto de vista de la interpretación y tufneado en términos de la forma

aquí.

Pero lo que no he visto comentar es que las variaciones reflejan más cómo es el tamaño de las provincias (o regiones, estados, o las divisiones administrativas que se haya considerado) en cada uno de los países que si la renta está mejor o peor repartida.

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.

Pues sí, puede fabricarse uno para España

R

Es

responde a mi entrada de la semana pasada y se lo debemos a la gentileza de Sergio J.

El código, con mínimas modificaciones mías (para automatizar la descarga de los datos) es

library(pxR)
library(dplyr)
library(tidyr)
library(ggplot2)

#---- Carga y transformacion de datos

download.file("http://www.datanalytics.com/uploads/3199.px", "3199.px")

pob <- read.px("3199.px", encoding = "latin1")
pob <- as.data.frame(pob)
pob$Sexo <- NULL
pob$Periodo <- as.numeric(as.character(pob$Periodo))
pob <- separate(pob, Provincias, into = c("id_provincia", "provincia"), sep = 3)
pob$fecha <- as.Date(paste0(pob$Periodo, "-12-31"))
pob <- subset(pob,as.numeric(id_provincia)<=50)

#---- Plot

bl <- sapply(1:22, function(n) paste(rep(" ",n),collapse=""))

pob$provincia.reorder <- factor(
    pob$provincia,
    levels = c("Coruña, A","Lugo","Asturias","Cantabria","Bizkaia","Gipuzkoa","Navarra",bl[1:2],
  "Pontevedra","Ourense","León","Palencia","Burgos","Araba/Álava" ,"Huesca","Lleida","Girona",
  bl[3:4],"Zamora","Valladolid","Soria","Rioja, La","Zaragoza","Tarragona","Barcelona",
  bl[5:6],"Salamanca","Ávila","Segovia","Guadalajara","Teruel",bl[7:8],
  bl[9:10],"Cáceres","Toledo","Madrid","Cuenca","Castellón/Castelló",bl[11],"Balears, Illes",
  bl[12:13],"Badajoz","Córdoba","Ciudad Real","Albacete", "Valencia/València",bl[14:15],
  bl[16:17],"Huelva","Sevilla","Jaén","Murcia","Alicante/Alacant",bl[18:19],
  bl[20:21],"Cádiz","Málaga","Granada","Almería",bl[22],"Palmas, Las","Santa Cruz de Tenerife"))

ggplot(pob, aes(x = fecha, y = value)) +
  geom_line() + facet_wrap(~ provincia.reorder,
    ncol=9,drop = F, strip.position="bottom") +
  labs(title = "Evolución de la edad media por provincias en España (1975-2016)", y="Edad Media") +
  theme_classic() +
  theme(axis.text.x = element_blank(),
        strip.background=element_blank(),
        axis.line=element_blank(),
        axis.ticks=element_blank())

Se aceptan modificaciones y mejoras, por supuesto. Y si alguien quiere dedicarle el tiempo necesario para crear un paquete en R que lo generalice, creo que será bienvenido por la comunidad.

¿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.