La librería ggplot2 de R es un sistema organizado de visualización de datos. Forma parte del conjunto de librerías llamado tidyverse.
En este escrito se introduce su uso, principalmente a través de ejemplos. La primera parte muestra las características generales del sistema utilizando como ejemplo los diagramas de dispersión. En la segunda parte se detalla cómo representar algunos de los gráficos más conocidos.
Los elementos necesarios para representar un gráfico con ggplot2 son los siguientes:
Un data frame que contiene los datos que se quieren visualizar.
Los aesthetics, es decir, una lista de relaciones entre las variables del fichero de datos y determinados aspectos del gráfico (como por ejemplo coordenadas, formas o colores).
Los geoms, que especifican los elementos geométricos (puntos, líneas, círculos, etc) que se van a representar.
Normalmente estos elementos se van añadiendo de forma consecutiva en distintas capas (layers). Para añadir una nueva capa se usa el signo \(+\). La estructura general del código para obtener un gráfico es esta:
ggplot(data = 'nombre del fichero de datos o data frame') +
geom_nombre1(aes(aesthetics1=var1, aesthetics2=var2, ...)) +
geom_nombre2(...)
El comando ggplot se usa para generar el sistema de coordenadas (por defecto, rectangulares) y posteriormente vamos añadiendo los geoms con sus correspondientes aesthetics. En principio los aesthetics se pueden asignar individualmente para cada geom.
Para realizar los ejemplos usaremos la base de datos iris que viene por defecto en R.
head(iris)
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1 5.1 3.5 1.4 0.2 setosa
## 2 4.9 3.0 1.4 0.2 setosa
## 3 4.7 3.2 1.3 0.2 setosa
## 4 4.6 3.1 1.5 0.2 setosa
## 5 5.0 3.6 1.4 0.2 setosa
## 6 5.4 3.9 1.7 0.4 setosa
Recordemos que el conjunto de datos flor Iris o conjunto de datos iris de Fisher es un conjunto de datos multivariante introducido por Ronald Fisher en su artículo de 1936, The use of multiple measurements in taxonomic problems (El uso de medidas múltiples en problemas taxonómicos) como un ejemplo de análisis discriminante lineal. A veces, se llama Iris conjunto de datos de Anderson porque Edgar Anderson coleccionó los datos para cuantificar la variación morfológica de la flor Iris de tres especies relacionadas. Dos de las tres especies se coleccionaron en la Península de la Gaspesia «todos son de la misma pastura, y recolectado el mismo día y medidos al mismo tiempo por la misma persona con el mismo aparato».
El conjunto de datos contiene 50 muestras de cada una de tres especies de Iris (Iris setosa, Iris virginica e Iris versicolor). Se midió cuatro rasgos de cada muestra: el largo y ancho del sépalo y pétalo, en centímetros. Basado en la combinación de estos cuatro rasgos, Fisher desarrolló un modelo discriminante lineal para distinguir entre una especie y otra.
En este diagrama matemático se utiliza para observar en las coordenadas cartesianas los valores de dos variables para un conjunto de datos, en este caso vamos a observar el largo del sépalo (Sepal.Length) versus el ancho del mismo (Sepal.Width).
plot(x=iris$Sepal.Length, y=iris$Sepal.Width,
xlab="Largo del sépalo (Sepal Length)", ylab="Ancho del sépalo (Sepal Width)", main="Sépalo (largo versus ancho)")
Ahora usemos la librería ggplot
library(ggplot2)
scatter <- ggplot(data=iris, aes(x = Sepal.Length, y = Sepal.Width))
scatter + geom_point(aes(color=Species, shape=Species)) +
xlab("Largo del sépalo (Sepal Length)") + ylab("Ancho del sépalo (Sepal Width)") +
ggtitle("Sépalo (largo versus ancho)")
Notesé que hay una relación clara y lineal para la especie setosa entre el largo y el ancho del sépalo, algo que no están claro pero existe entre las especies versicolor y virginica.
scatter + geom_point(aes(color = Petal.Width, shape = Species), size = 2, alpha = I(1/2)) +
geom_vline(aes(xintercept = mean(Sepal.Length)), color = "red", linetype = "dashed") +
geom_hline(aes(yintercept = mean(Sepal.Width)), color = "red", linetype = "dashed") +
scale_color_gradient(low = "yellow", high = "red") +
xlab("Largo del sépalo (Sepal Length)") + ylab("Ancho del sépalo (Sepal Width)") +
ggtitle("Sépalo (largo versus ancho)")
Un diagrama de caja (también, diagrama de caja y bigotes o box plot) es un método estandarizado para representar gráficamente una serie de datos numéricos a través de sus cuartiles. De esta manera, se muestran a simple vista la mediana y los cuartiles de los datos, y también pueden representarse sus valores atípicos. Conviene recordar que se utilizan las bisagras de Tukey, y no los cuartiles, a la hora de dibujar la caja del gráfico, aunque los resultados son semejantes en muestras grandes.
boxplot(Sepal.Length~Species,data=iris,
xlab="Especies (Species)", ylab="Largo del sépalo (Sepal Length)", main="Iris Boxplot")
Como observamos en la variable largo del sépalo (Sepal Length), tenemos un dato atípico en la especie virginica sobre 4.9. También podemos observar por color y ver el dato promedio por especie de la siguiente manera:
box <- ggplot(data=iris, aes(x=Species, y=Sepal.Length))
box + geom_boxplot(aes(fill=Species)) +
ylab("Largo del sépalo (Sepal Length)") + ggtitle("Iris Boxplot") +
xlab("Especies (Species)")+
stat_summary(fun.y=mean, geom="point", shape=5, size=4)
En estadística, un histograma es una representación gráfica de una variable en forma de barras, donde la superficie de cada barra es proporcional a la frecuencia de los valores representados. Sirven para obtener una “primera vista” general, o panorama, de la distribución de la población, o de la muestra, respecto a una característica, cuantitativa y continua (como la longitud o el peso). De esta manera ofrece una visión de grupo permitiendo observar una preferencia, o tendencia, por parte de la muestra o población por ubicarse hacia una determinada región de valores dentro del espectro de valores posibles (sean infinitos o no) que pueda adquirir la característica. Así pues, podemos evidenciar comportamientos, observar el grado de homogeneidad, acuerdo o concisión entre los valores de todas las partes que componen la población o la muestra, o, en contraposición, poder observar el grado de variabilidad, y por ende, la dispersión de todos los valores que toman las partes, también es posible no evidenciar ninguna tendencia y obtener que cada miembro de la población toma por su lado y adquiere un valor de la característica aleatoriamente sin mostrar ninguna preferencia o tendencia.
hist(iris$Sepal.Width, freq=NULL, density=NULL, breaks=12,
xlab="Largo del sépalo (Sepal Length)", ylab="Frecuencia", main="Histograma del ancho Sépalo")
Ahora podemos ver por especie con un color representativo
histogram <- ggplot(data=iris, aes(x=Sepal.Width))
histogram + geom_histogram(binwidth=0.2, color="black", aes(fill=Species)) +
xlab("Largo del sépalo (Sepal Length)") + ylab("Frecuencia") + ggtitle("Histograma del ancho Sépalo")