- Publicado el
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.
- Autores
-  -  - Nombre
- Franz Jimeno
- @franzz2000
 
- CMIO at HUCA - MD at CS Corredoria (Oviedo) at SESPA
 
-  
Tabla de contenidos
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.abbCreamos 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)Crea una nueva gráfica 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)<span class="paren">)</span>
    print(b, vp = subplot(3, 1)<span class="paren">)</span>
}
mmplot(p4, data_table)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.