Gráficos

Grafos sobre mapas

R

He escrito de grafos, he escrito de mapas; hoy hablaré de la combinación de ambas cosas.

Tengo un grafo cuyos nodos están geoposicionados. Lo quiero estudiar utilizando herramientas de grafos (vía igraph) pero después representarlos sobre una capa con información geográfica (una foto satelital de Google Maps, vamos).

La red va a ser la de guifi.net en los derredores de Barcelona. guifi.net es un proyecto para crear una red de telecomunicaciones mancomunada, abierta, libre y neutral. Quienes forman parte de ella colocan antenas que se conectan con otras de la red y comienzan en enviar bits. Las antenas y sus conexiones conforman una red que se puede estudiar como cualquier otra: ¿qué nodos/enlaces son más centrales/críticos? Etc.

Taller de mapas con R el 14 de abril en Madrid

Mi entrada de hoy es para anunciar un taller de mapas con R que tendrá lugar el día 14 de abril de 18 a 21 horas en Martina Cocina (cómo llegar).

Lo impartirá Beatriz Martínez, socióloga dedicada a la investigación social y de mercados, que ha trabajado en numerosos proyectos: desde investigación digital al desarrollo rural o programas de inclusión social. Está especializada en la la visualización de datos. Algunos de sus trabajos pueden verse en visualizados.com.

Compresión con SVD

svd_greco

lo he creado con

library(png)

tmp.file <- tempfile()
download.file("http://datanalytics.com/uploads/greco.png", tmp.file)
m <- readPNG(tmp.file)

svd.m <- svd(m)

filtra.svd <- function(svd, k){
  tmp <- svd
  tmp$d[(k+1):length(tmp$d)] <- 0
  res <- tmp$u %*% diag(tmp$d) %*% t(tmp$v)

  res[res > 1] <- 1
  res[res < 0] <- 0

  plot(1:2, type='n', xlab = "",
        ylab = "", xaxt = "n", yaxt = "n",
        main = paste(k, "primeras componentes", sep = " "))
  rasterImage(res, 1, 1, 2, 2)
}

layout(matrix(1:9, 3, 3, byrow = T))

sapply(c(1,2,3,5,10,15,20,30,50),
        function(k) filtra.svd(svd.m, k))

Recurrencia recurrente

Pregunta Antonio Sánchez Chinchón cómo mejorar la parte menos vistosa e imaginativa de esto, es decir, el código. Él, y muchos diríamos que correctamente, autocritica el uso de eval + parse para plagar el namespace de funciones.

La respuesta está en la recurrencia. He aquí mi versión del código:

library(ggplot2)
library(gridExtra)

nrows <- 6
coefs.a <- runif(min=1, max=50, nrows)
coefs.b <- runif(min=1, max=50, nrows)

foo.a <- sample(c(sin, cos), nrows, replace = TRUE)
foo.b <- sample(c(sin, cos), nrows, replace = TRUE)

foo <- function(x, a, b){
  if(a == 1 || b == 1)
    return(foo.a[[a]](coefs.a[a] * x))

  if(b == a)
    return(foo.b[[a]](coefs.b[a] * x))

  foo(x, a-1, b) + foo(x, a-1, b-1)
}

vplayout = function(x, y) viewport(layout.pos.row = x, layout.pos.col = y)

opts=theme(legend.position="none",
      panel.background = element_rect(fill="gray95"),
      plot.background = element_rect(fill="gray95", colour="gray95"),
      panel.grid = element_blank(),
      axis.ticks=element_blank(),
      axis.title=element_blank(),
      axis.text =element_blank())

grid.newpage()

jpeg(file="AddingWaves.jpeg", width = 1800, height = 1000,
      bg = "gray95", quality = 100)

pushViewport(viewport(layout = grid.layout(nrows, 2*nrows-1)))

for (i in 1:nrows) {
  for (j in 1:i) {
    print(ggplot(data.frame(x = c(0, 20)), aes(x)) +
            stat_function(fun = function(x) foo(x, i, j),
                  colour = "black", alpha=.75)+opts,
          vp = vplayout(i, nrows+(2*j-(i+1))))
  }
}

dev.off()

El resultado es

¿Hubo alguna vez un millón de palentinas?

En el año 2013 hubo 54 muertes de mujeres por violencia de género. Eso da una tasa nacional de poco más de dos por millón (de mujeres). El Mundo nos lo ha querido mostrar su distribución provincial así:

victimas_mortales_provincia

Diríase que la tasa palentina es enorme, cinco veces la nacional. Pero en Palencia viven del orden de cien mil mujeres y hubo un único caso en 2013 (además, ni la mujer ni el agresor, se ve, eran de la provincia sino de un pueblo limítrofe de Cantabria; solo que el cadáver apareció en al sur de la linde).

Gráficos e interactividad: una ocasión desaprovechada

Cuando los gráficos son estáticos, los compromisos mandan. ¿Mostramos las diferencias relativas? ¿O las magnitudes absolutas? Ocurre casi indefectiblemente que cuando uno opta por una opción siempre alguien en la audiencia levanta el dedo y sugiere la alternativa. ¿Mostramos ambas a la vez? Entonces abusamos de la usualmente limitada superficie construible de nuestro informe y, además, violentamos ese principio de que lo bué, si bré, dos ve bué.

La interactividad en los gráficos permite superponer vistas diversas de unos datos en un recinto acotado. Pagamos un peaje: tenemos que descubrir nosotros mismos la que más nos interesa y navegar hasta ella. Pero, por lo general, compensa.

Dime, ¿qué quieres comparar con qué?

A veces alguien me pregunta cómo representar gráficamente ciertos datos. Yo respondo casi siempre igual, casi siempre con la misma pregunta: ¿qué quieres comparar con qué? Luego se trata solo de disponer las magnitudes que se desea comparar próximas, paralelas y con un mismo eje de referencia.

Si se puede, claro.

Con el gráfico

evolucion_deuda

que acompaña al artículo La deuda atenaza la recuperación el pobre ilustrador no lo tenía fácil. Por un lado tenía que comparar la evolución de una magnitud en dos momentos distintos y lo que más claro deja es que ni ha leído Displaying Change Between Two Points in Time ni le suena lo que reza. Y haré como que no he visto esos circulillos grises al pie.

¿Dónde he estado (según Google)?

Leí esto el otro día. Lo voy a replicar con mis datos.

Contexto

Google guarda datos de tus ubicaciones: tu tableta, tu ordenador, tu teléfono Android son espías a su servicio. Los datos los guarda en aquí (creo que necesitarás que en tu navegador haya una sesión abierta con tus credenciales del universo Google). Pulsando en administrar archivos y luego en crear archivos puedes seleccionar el tipo de información sobre ti que posee Google y que quieres descargarte. Para este ejemplo, será el Historial de Ubicaciones.

Missing

Dos motivos me han tenido missing estas últimas semanas. Uno es una estancia en la Universidad de Santa Catalina del Burgo de Osma. Oportunamente ubicada en las estribaciones de la muy generosa en caldos de calidad Ribera del Duero, ha sido reconvertida a la sazón en un hotel propicio para la evasión y la agrafía.

vim_package

El segundo es que en horas intempestivas he estado purgando de missings unas matrices enormes y de la, se conoce, mayor trascendencia. Es un asunto delicado, jamás bien resuelto, para el que el paquete [VIM](http://cran.r-project.org/web/packages/VIM/index.html) puede proporcionar ayuda. Sobre todo en los aspectos gráficos.

Factorización de enteros con grid

Vi esto y me dije: yo también quiero. Así que dicho y hecho:

100

Por si acaso, cada diagrama representa la descomposición en números primos de un número del 1 al 100.

El código (que no he adecentado lo que suelo) es un pequeño ejercicio con el paquete grid y unos elementos de recursividad (como en Grid, Scala y arbolitos fractales):

library(grid)
library(gmp)

plot.factors <- function(n, new.plot = TRUE){

  if(new.plot)
    grid.newpage()

  divisors <- sort(as.integer(factorize(n)), decreasing = T)

  foo <- function(divs){
    if(length(divs) == 0){
      grid.circle(x = 0.5, y = 0.5, r = 0.5,
                  gp=gpar(fill="black"))
      return()
    }

    n <- divs[1]

    x <- (Re(exp( 2 * pi *(1:n) * 1i /n))) / 4 + 0.5
    y <- (Im(exp( 2 * pi *(1:n) * 1i /n))) / 4 + 0.5

    for(i in 1:n){
      tmp <- viewport(x = x[i], y = y[i],
                      w = 2/(3 + n), h = 2/(3 + n))
      pushViewport(tmp)
      #grid.rect(gp = gpar(col = "grey"))
      foo(divs[-1])
      popViewport()
    }
  }

  foo(divisors)
}

plot.factors(25)


grid.newpage()

nrow <- 10
ncol <- 10

for(y in 1:nrow){
  for(x in 1:ncol){
    tmp <- viewport(x = x / (1 + ncol), y = 1 - y / (1 + nrow),
                    w = 1/(1 + ncol), h = 1/(1+ncol))
    pushViewport(tmp)
    #grid.rect(gp = gpar(col = "grey"))
    plot.factors(x + y * ncol - ncol, new.plot = FALSE)
    popViewport()
  }
}

Facetas para entender, tal vez, la evolución del paro

La verdad, no sé de dónde los sacan porque la EPA es trimestral. Pero el INE publica datos mensuales de la tasa de desempleo y las cuelga de una de esas URLs que tienen pinta de cambiar con cualquier soplo (es decir, aviso de que en cualquier momento el enlace deja de funcionar). Por ssi acaso, estos son los datos a día de hoy.

También aparecen publicados regularmente en prensa. Y los expertos opinan sobre si la cifra es buena y o mala. Pero, ¿buena o mala con respecto a qué? Así que hoy voy a ensayar un marco en el que plantear la pregunta:

¿Fascinados por las cosas circulares?

Llevo un tiempo prestando especial atención a los gráficos circulares. Y no me refiero a los innombrables. Hablo más bien de otros como

procedencia_jugadores_futbol

extraído de aquí o

marketing_circle_graph

que encontré acá.

¿Realmente aporta algo el uso de coordenadas polares? ¿Por qué nos fascinan? ¿Por qué nos resultan tan naturales y familiares? Más aún, ¿abusamos de ellos? ¿Existen alternativas cartesianas más eficaces?

Vengo, como digo, prestando atención a los gráficos circulares y planteándome esas preguntas después de leer Our Irresistible Fascination with All Things Circular. Artículo que, por supuesto, invito a hojear.