Gráficos

El pomelazo del CSIC

Dado que el CSIC nos está pidiendo que hagamos algo por él, perdí un rato el otro día tratando de averiguar qué había hecho él por mí.

Navegando por sus páginas di con este documento y, al abrirlo, recibí este pomelazo en tol’ojo:

Carajo, pero ¿quién hizo eso? ¿Por qué? ¿Con qué programa? ¿Nadie en todo el CSIC levantó la voz? ¡Que hablamos del CSIC y no de un ayuntamiento menor!

El carajal de las representaciones gráficas de "redes sociales"

Seamos honestos: en representaciones gráficas de grafos similares a

no vemos/entendemos un carajo. Al menos yo.

Es cierto que de vez en cuando los fabrico. Y que aquellos a quienes se los enseño con la cara muy seria, asienten (o, incluso aplauden) por algún motivo. Sospecho que porque piensan que el emperador está vestido (y no en porretas, como parece que les da pudor reconocer).

Afortunadamente, hay quienes han asumido el problema (de la falta de interpretabilidad, consecuencia del exceso de información irrelevante de ese tipo de representaciones) y están proponiendo soluciones. El vídeo

Mapas, mapas, mapas... ¿y?

No paro de decir para mis adentros “¿y?” según hojeo el recién publicado Atlas de mortalidad en municipios y unidades censales de España.

En el prefacio del estudio se lee:

En sus páginas encontrará los reflejos de las construcciones sociales que condicionan las oportunidades de salud y bienestar de las personas, mostrando que el espacio para políticas de reducción de desigualdades sociales en salud es amplio.

Pues no, no encuentro reflejos de construcciones sociales. Lo que encuentro son áreas administrativas. Las construcciones sociales que ocurren dentro de dichas áreas administrativas brillan, si acaso, por su ausencia.

Teruel, Orense, Palencia... y adenoidectomías

Quien haya recorrido Teruel, Orense, Palencia, la zona de Almadén y otras partes del interior de España abandonadas a su suerte desde hace siglos no habrá visto demasiado crío. Me acabo de enterar que a lo que se conoce como operar de vegetaciones recibe el nombre de adenoidectomía. Y he visto el mapa

en Nada es Gratis.

Me ha dado por pensar si los autores (del gráfico) estuvieron atentos a mi bitácora cuando escribí esto.

La cosa más friqui que he visto en...

Es la cosa más friqui que he visto en tiempos. “Esto va intravenoso al blog”, me he dicho. Es esto.

Se trata de un paquete de R de Emilio Torres Manzanera con el que se pueden construir gráficos como

al más puro estilo xkcd. Para probarlo,

library(xkcd)
vignette(“xkcd-intro”)

¡Disfrutad!

Mapa de los terremotos en la península ibérica

Me sorprendió hace un tiempo averiguar que en la península ibérica hubiese tantos terremotos (aunque mis amigos chilenos los llamarían de otra manera).

En esta entrada voy a mostrar el siguiente mapa de actividad sísmica durante los últimos años,

que he construido con el siguiente código en R:

library(ggmap)

url <- "http://comcat.cr.usgs.gov/earthquakes/feed/search.php?maxEventLatitude=45&minEventLatitude=35&minEventLongitude=-10&maxEventLongitude=5&minEventTime=953683200000&maxEventTime=1364688000000&minEventMagnitude=-1.0&maxEventMagnitude=10&minEventDepth=0.0&maxEventDepth=800.0&format=csv"
terremotos <- read.csv(url)

# obtengo un mapa
pen.iber <- get_map( location = c(-9.5, 36, 3.5, 44),
                      color = "color",
                      maptype = "roadmap")

# le añado puntos
ggmap(pen.iber) +
  geom_point(aes(x = Longitude, y = Latitude,
                  size = Magnitude),
                  data = terremotos, colour = 'red',
                  alpha = 0.2)

Mapas, ¿realmente necesarios?

Creo que no. Lo reitero a cuenta de la entrada Sencillo, espectacular, falso de malaprensa.com, en que se critica el gráfico

aparecido en El Confidencial.

Estoy de acuerdo con Josu Mezo en que es una chapuza. Pero discrepo con él en el diagnóstico. Creo que el problema no es tanto que no se estén representando las áreas proporcionalmente al fenómeno que se mide —y es ocioso reiterar aquí la discusión sobre cómo el ojo percibe o deja de percibir la proporcionalidad de áreas (o volúmenes) y las magnitudes que se intenta representar con ellas— como ese afán por pintarlo todo sobre un mapa.

ggmap: mapas con R

Me mandó Alberto González Paje código para representar información en mapas usando R que hoy he dejado en su mínima expresión para que los lectores de esta bitácora puedan extender para crear sus propios mapas.

Es el siguiente:

library(ggmap)

# ubico mi alma mater
unizar <- geocode('Universidad de Zaragoza, Zaragoza, España')

# obtengo un mapa
map.unizar <- get_map(
    location = as.numeric(unizar),
    color = "color",
    maptype = "roadmap",
    scale = 2,
    zoom = 16)

# lo represento
ggmap(map.unizar)

# le añado puntos
ggmap(map.unizar) + geom_point(
    aes(x = lon, y = lat),
    data = unizar, colour = 'red',
    size = 4)

Creo que es fácil de extender.

Addenda: ¿qué ha pasado en el Ibex durante el último mes?

Abundando en el tema de ayer, ahora, los mismos datos representados con mapas de calor:

Para obtenerlo, a lo que ya teníamos basta añadirle:

library(gplots)
heatmap.2(
    as.matrix(ibex.scaled),
    Rowv=F, Colv=T, key=F, trace="none",
    col=redgreen, xlab="valor", ylab="",
    margins=c(5,10))

¿Qué ha pasado en el Ibex durante el último mes?

Pues esencialmente esto:

Es decir, un grupo numeroso de valores ha bajado de precio mientras que otros dos grupos han tenido una evolución en U y ha recuperado, con creces incluso, el valor que tenían hace un mes.

Y, como siempre, el código:

library(tseries)
library(zoo)
library(XML)
library(reshape)
library(ggplot2)

foo  <- function(simbolo, final = Sys.time(), profundidad = 30 * 24 * 3600 ){
  precios <- get.hist.quote(
    instrument= simbolo, start = final - profundidad,
    end = final, quote=c("AdjClose"),
    provider="yahoo", origin="1970-01-01",
    compression="d", retclass="zoo")
  colnames(precios) <- simbolo
  return(precios)
}

# lista de símbolos del ibex

tmp <- readHTMLTable("http://finance.yahoo.com/q/cp?s=%5EIBEX+Components")[[5]]
tmp <- as.character(tmp$V1[-(1:6)])
tmp <- gsub("-P", "", tmp)
simbolos <- tmp[tmp != "ABG.MC"]

ibex <- do.call(merge, sapply(simbolos, foo, simplify = F))

ibex.scaled <- scale(ibex)

ibex.df <- data.frame(ibex.scaled, fecha = index(ibex.scaled))
ibex.df <- melt(ibex.df, id.vars = "fecha")
ibex.df <- ibex.df[ order(ibex.df$fecha, ibex.df$variable), ]
ibex.df$cluster <- kmeans(data.frame(t(ibex.scaled)), 4)$cluster

ggplot(ibex.df, aes(x=fecha, y=value, group=variable)) +
        geom_line() + facet_wrap(~cluster)

Arte con R: tres enlaces

Traigo hoy a mi bitácora tres enlaces sobre la creación de artefactos gráficos con R.

En el primero (¡en japonés!) puede uno aprender a construir cosas como

El segundo reproduce con R la siguiente obra de Bridget Riley:

Y el tercero es una elaboración sobre el anterior que permite generar gráficos tales como

El Ibex 35 al estilo GapMinder

Quiero representar hoy la evolución del Ibex 35 a lo largo del año pasado al estilo GapMinder. En concreto, usando un MotionChart de Google.

Primero, bajo los símbolos de los activos del Ibex de Yahoo! Finance:

library(XML)
simbolos <- readHTMLTable(htmlParse("http://finance.yahoo.com/q/cp?s=%5EIBEX+Components"))
simbolos <- as.character(simbolos[[9]]$Symbol)
simbolos <- gsub("-P", "", simbolos)

Luego, creo una pequeña función y se la aplico a cada símbolo:

library(tseries)

foo  <- function( simbolo, final = Sys.time(), profundidad = 365 * 24 * 3600 ){

    tmp <- get.hist.quote(
        instrument= simbolo, start = final - profundidad,
        end= final, quote="AdjClose",
        provider="yahoo", origin="1970-01-01",
        compression="d", retclass="zoo")

    precios <- as.data.frame(tmp)
    precios$fecha <- index(tmp)
    rownames(precios) <- NULL
    precios$simbolo <- simbolo

    precios$AdjClose <- 100 * precios$AdjClose / precios$AdjClose[1]
    precios$x <- as.numeric(precios$fecha)
    precios$x <- 1 + precios$x - precios$x[1]
    colnames(precios) <- c("precio", "fecha", "simbolo", "dias")

    precios
}

res <- sapply(simbolos, foo, simplify = F)
res <- do.call(rbind, res)

Finalmente, creo el gráfico:

Sanidad pública, sanidad privada

Lo siento. El título es engañoso. No voy a abundar en el tema de modelo sanitario. Aunque esté de moda. Traje a este debate ideas preconcebidas que se me han ido pegando durante años de andar sobre la faz de la tierra. Y mis esfuerzos me ha costado desprenderme cartesianamente de ellas para quedarme a la espera de que alguien me ilumine de manera clara y distinta. Solo sospecho que la respuesta no puede resumirse en un monosílabo, que es mixta y con ejércitos de demonios camuflados tras los detalles. Pero lo que opine es prácticamente irrelevante.