R

He estado buscando en numerosos sitios la forma de hacer una secuencia de grafos que mostraran cómo se iban recolocando los vértices aplicando un determinado algoritmo dando sensación de movimiento, y no encontraba nada hasta que llegué a esta dirección que explica cómo hacer una secuencia termporal con grafos obtenidos de datos de Twitter. El problema es que el método utilizado sirve para versiones antiguas de igraph y no funcionan en la versión 1.0.Aquí muestro una adaptación sencilla para la versión 1.0 y posteriores de igraph:

 

Mi experiencia con expresiones regulares es bastante baja, por lo que en ocasiones tengo muchos problemas para definirlas en R.

Con la funcion glob2rx puedo crear expresiones regulares con facilidad, utilizando el "globbing pattern" que sirve para buscar ficheros en la consola.

Dejo un ejemplo de cómo seleccionar unos ficheros que comiencen por un texto y finalicen con una determinada extensión.

#Busco ficheros que comiencen por "tex_" y finalicen con ".pdf"

list.files(pattern=glob2rx("tex_*.pdf"))

#La expresión regular para esta búsqueda sería
glob2rx("tex_*.pdf"))

[1] "^tex_.*\\.pdf$"

Este documento también está publicado en Rpubs

 

Añadir la tabla de datos a una gráfica con ggplot2

 

Este método ayuda a añadir una tabla a una grafica generada con ggplot2. Este ejemplo funciona con la versión 0.9.3.1, no funciona con versiones anteriores de ggplot2 y no aseguro que funcione con versiones posteriores.

 

Cargamos las librerías necesarias para generar la gráfica.

 

El ejemplo es una adaptación del post de Learning R: ggplot2: Labelling Data Series and Adding a Data Table

 

Primeramente seleccionamos las librerías necesarias para el ejemplo. Estas se han de instalar antes con el comando install.packages(“NombreDeLaLibrería”)

 

library(ggplot2)
library(scales)
library(plyr)
library(reshape2)
library(grid)

 

Creamos un data.frame para el ejemplo

 

df <- structure(list(City = structure(c(2L, 3L, 1L), .Label = c("Minneapolis", 
    "Phoenix", "Raleigh"), class = "factor"), January = c(52.1, 40.5, 12.2), 
    February = c(55.1, 42.2, 16.5), March = c(59.7, 49.2, 28.3), April = c(67.7, 
        59.5, 45.1), May = c(76.3, 67.4, 57.1), June = c(84.6, 74.4, 66.9), 
    July = c(91.2, 77.5, 71.9), August = c(89.1, 76.5, 70.2), September = c(83.8, 
        70.6, 60), October = c(72.2, 60.2, 50), November = c(59.8, 50, 32.4), 
    December = c(52.5, 41.2, 18.6)), .Names = c("City", "January", "February", 
    "March", "April", "May", "June", "July", "August", "September", "October", 
    "November", "December"), class = "data.frame", row.names = c(NA, -3L))

 

Transformamos el data.frame para que se pueda utilizar dentro de ggplot2. En lugar del formato de tabla, nos interesa un data.frame con columnas y una variable de frecuencia que llamaremos month. Acortamos los nombres de los meses con month.abb.

 

dfm <- melt(df, variable.name = "month", id = "City")
levels(dfm$month) <- month.abb

 

Creamos la variable p con los datos necesarios para generar la gráfica. Con la segunda instrucción generamos una gráfica de lineas.

 

p <- ggplot(dfm, aes(month, value, group = City, colour = City))

p1 <- p + geom_line(size = 1)

 

Función que imprime el símbolo de grados junto al número.

 

dgr_fmt <- function(x, ...) {
    parse(text = paste(x, "*degree", sep = ""))
}

 

Cambios esteticos en el gráfico. Eliminamos la rejilla, la leyenda, el fondo y el borde. Damos un color gris a los ejes.

 

none <- element_blank()

p2 <- p1 + theme_bw() + scale_y_continuous(labels = dgr_fmt, limits = c(0, 100), 
    expand = c(0, 0)) + labs(title = expression("Average Monthly Temperatures (" * 
    degree * "F)"), x = NULL, y = NULL) + theme(panel.grid.major = none, panel.grid.minor = none, 
    legend.position = "none", panel.background = none, panel.border = none, 
    axis.line = element_line(colour = "grey50"))

 

Añadimos unas líneas para indicar las estaciones del año y el punto de congelacion.

 

p3 <- p2 + geom_vline(xintercept = c(2.9, 5.9, 8.9, 11.9), colour = "grey85", 
    alpha = 0.5) + geom_hline(yintercept = 32, colour = "grey80", alpha = 0.5) + 
    annotate("text", x = 1.2, y = 35, label = "Freezing", colour = "grey80", 
        size = 4) + annotate("text", x = c(1.5, 4.5, 7.5, 10.5), y = 97, label = c("Winter", 
    "Spring", "Summer", "Autumn"), colour = "grey70", size = 4)

 

Añadimos un texto que muestra el nombre de la ciudad junto a la linea que le corresponde

 

p4 <- p3 + geom_text(data = dfm[dfm$month == "Dec", ], aes(label = City), hjust = 0.7, 
    vjust = 1)

 

Generamos la tabla en formato ggplot, para poder añadirla al gráfico.

 

data_table <- ggplot(dfm, aes(x = month, y = factor(City), label = format(value, nsmall = 1), colour = City)) + 
geom_text(size = 3.5) +
theme_bw() +
scale_y_discrete(labels = abbreviate, limits = c("Minneapolis", "Raleigh", "Phoenix")) +
theme(panel.grid.major = element_blank(),
legend.position = "none",
panel.border =
element_blank(),
axis.text.x =
element_blank(),
axis.ticks =
element_blank(), plot.margin = unit(c(-0.5, 1, 0, 0.5), "lines")) +
labs(x = NULL, y = NULL)

 

Con la función grid creamos la plantilla para insertar los 2 gráficos. Se trata de una rejilla de 1 columna y 3 filas con proporciones 2:0.01:0,25. La unidad es null, que solo se puede utilizar con grid.layout. El hueco de 0.01 evita que se solapen las gráficas y salgan las etiquetas de la gráfica cortadas.

 

Layout <- grid.layout(nrow = 3, ncol = 1, heights = unit(c(2.5, 0.01, 0.25), 
    c("null", "null", "null")))

grid.show.layout(Layout)

 

plot of chunk unnamed-chunk-10

 

Crea una nueva grafica con la plantilla Layout a través de la función vplayout. Selecciona el hueco con subplot y añade las 2 gráficas con la función mmplot.

 

vplayout <- function(...) {
    grid.newpage()
    pushViewport(viewport(layout = Layout))
}

subplot <- function(x, y) viewport(layout.pos.row = x, layout.pos.col = y)

mmplot <- function(a, b) {
    vplayout()
    print(a, vp = subplot(1, 1))
    print(b, vp = subplot(3, 1))
}
mmplot(p4, data_table)

 

plot of chunk unnamed-chunk-11

 

 

En este procedimiento se utiliza la librería grid que permite incluir varias gráficas en un mismo objeto, pudiendo modificar sus dimensiones y posición. Existe una librería que simplifica mucho esto y que añade algunas funcionalidades, que se llama gridExtra. No sirve para el ejemplo anterior, pero sí que ayuda en otras ocasiones.

El paquete longtable en LaTeX define los siguientes comandos para definir encabezados, y pies de tabla:

\endfirsthead: Linea o lineas que aparecen como encabezado en la primera página
\endhead: Linea o lineas que aparecen como encabezado de todas las páginas, excepto la primera
\endfoot: Linea o lineas que aparecen en el pie de la tabla de cada página, excepto en la última página
\endlastfoot: Linea o lineas que aparecen al final de la tabla

Hay que añadir un \endhead después de la primera fila de la tabla con el parámetro add.to.row de la función print.xtable. Muestro un ejemplo que he encontrado en StackOverflow:

addtorow          <- list()
addtorow$pos      <- list()
addtorow$pos[[1]] <- c(0)
addtorow$command  <- c(paste("\\hline \n",
                             "\\endhead \n",
                             "\\hline \n",
                             "{\\footnotesize Continúa en la página siguiente...} \n",
                             "\\endfoot \n",
                             "\\endlastfoot \n",sep=""))
x.big <- xtable(x, label = "tabbig", caption = "Ejemplo de una tabla que ocupa más de una página")
print(x.big, tabular.environment = "longtable", floating = FALSE,
      include.rownames = FALSE,  # addtorow no incluye los nombres de las filas
      add.to.row = addtorow,     # aquí es donde se añade el encabezado
      hline.after=c(-1))         # addtorow sustituye la hline de la primera fila