- 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.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)
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.