Gráficos

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.

No es país para "biplots"

No, parece que aún no estamos preparados para los biplots. En el curso Introduction to Infographics and Data Visualization de Alberto Cairo, nos pidieron sugierir mejoras y alternativas a este gráfico:

En el curso aparecieron sugerencias tales como esta,

esta, y otras similares que jugaban con los elementos gráficos habituales con más o menos arte, mejor o peor gusto en los colores, etc.

A mí se me ocurrió que los datos que aparecen en el gráfico original podía, con alguna salvedad y abusando del lenguaje, considerarse una especie de tabla de contingencia que incluía el número de personas que en cada país hacen uso de distintos tipos de servicios de internet. Y que entonces podría utilizar herramientas gráficas, tales como los biplots para visualizar los datos. El resultado fue

Veinte herramientas de visualización

Este es un listado de 20 herramientas de visualización que he extraído de aquí. Están divididas en varios grupos:

  • Básicas: Excel y, extrañamente, CSV y JSON (que aun sin ser herramientas de visualización, son formatos usuales para el intercambio de información usados por ellas).

  • Visualización en línea:

    • Google Chart API
    • Flot, Raphaël y D3, librerías de JavaScript.
    • visual.ly, que sirve para crear esas configuraciones rectangulares de números y símbolos no siempre útiles que algunos llaman infografías.
  • GUIs interactivos: Crossfilter y Tangle.

Algunos gráficos de información bursátil

Hoy voy a presentar algunos gráficos de información bursátil adaptados a partir de código de Eric Zivot, el instructor del curso Introduction to Computational Finance and Financial Econometrics que estoy siguiendo (un poco como puta por rastrojo: siempre me las arreglo para resolver los ejercicios en el último minuto y antes de haber revisado la teoría) en Coursera.

Por si pueden servir de algo a otros, los reproduzco y comento aquí. Primero, hay que importar las librerías necesarias:

Gráficos en R a la xkcd

Esto fue un reto en toda regla: un megafriqui publicó código en LaTeX para reproducir en dicho entorno gráficos como los que aparecen en xkcd.com, es decir, del tipo de

con el siguiente resultado:

La respuesta por parte de la comunidad de usuarios de R, obviamente, no podía demorarse. Y es

El código puede encontrarse aquí. Y más información sobre el asunto, recomiendo este otro enlace.