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 = none, 
    legend.position = "none", panel.border = none, axis.text.x = none, axis.ticks = none, 
    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