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.

No tiene permiso suficiente para añadir comentarios