Gráficos para una variable

Para crear gráficos de forma más profesional y estética, la librería de R más utilizada es ggplot2. El coste de producir gráficos más complejos es que usa una gramática de gráficos complicada. En este curso sólo pretendemos introducirnos en su uso, y mostrar algunos ejemplos para poder comprobar su versatilidad.

En primer lugar, debemos instalar las librerías a utilizar: ggplot2, ggpubr y patchwork. Después, las cargamos

library(ggplot2)
library(ggpubr)
library(patchwork)

Para hacer los gráficos con nuestros propios datos, tendríamos que cargarlos primero. En el menú File, Import Dataset, elegimos el tipo de archivo y buscamos nuestro archivo de datos. Por ejemplo, si cargamos el archivo de datos TIC.csv, del primer día, se crea un data.frame. Lo renombraremos como datosTIC.

datosTIC<-read.csv("C:/Users/evalsanjuan/OneDrive - Universidad de Extremadura/Clases/Estadística Computacional/Datos/TIC.csv")

Para visualizar algunos gráficos, también podemos simular algunos valores.

# Generamos variables que podamos usar como factor
n=100
d=sample(c(1,2,3,4,5),n,replace=TRUE)
f=sample(c(0,1),n,replace=TRUE)
#Ahora generamos variables numéricas
# Generamos n valores distribuidos uniformemente entre 0 y 10
v1=runif(n,0,10)
# Generamos los valores de v2 como una transformación lineal de v1,
# dependiendo de los factores d y f
v2=d*v1+3+rnorm(n,3*f,1)
# Creamos un data.frame con las variables v1, v2, d y f
datos <- data.frame(x=v1,y=v2,d=as.factor(d),f=as.factor(f))

Cada gráfico se construye inicialmente con el comando ggplot a partir de un conjunto de datos, (normalmente un data.frame), un comando aes, que especifica cuál o cuáles son las variables a representar, y un geom que nos indique qué tipo de gráfico vamos a generar. Finalmente, podemos sumar al gráfico elementos adicionales con aes, labs, theme, guides, stat_cor,…

Diagrama de barras

Un gráfico sencillo con una sola variable (discreta o cualitativa) sería un diagrama de barras, que se genera con geom_bar.

ggplot(datos)+
  aes(d)+
  geom_bar()

Podemos modificar algunos aspectos del gráfico. Por ejemplo, el nivel de transparencia alpha, color (color del contorno), fill(relleno), linetype

ggplot(datos)+
  aes(d)+
  geom_bar(alpha=0.5,fill="green",color="red",linetype="dotted")

Histograma

Otro gráfico muy sencillo es el histograma. Se debe usar el comando geom_histogram.

ggplot(datos)+
  aes(y)+ # indicamos la variable a representar
  geom_histogram()  # tipo de gráfico
## `stat_bin()` using `bins = 30`. Pick better value `binwidth`.

Modificamos el binwidth, que indica el ancho de las bandas, y añadimos algunos retoques.

ggplot(datos)+
  aes(y)+
  geom_histogram(binwidth=5,alpha=0.5,color="orange",fill="blue",linetype="dotted")+
  # añadimos título y etiquetas a los ejes
  labs(title="Histograma", x="Variable Cuantitativa", y="Frecuencia absoluta")

Otros

Otros gráficos disponibles para una sola variable son los polígonos de frecuencias geom_freqpoly, densidad geom_density, dotplot geom_dotplot, y área geom_area. Mostramos algunos ejemplos de su uso:

ggplot(datos)+
  aes(y)+
  geom_histogram(binwidth=5,alpha=0.5,color="orange",fill="blue",linetype="dotted")+
  labs(title="Histograma", x="Variable Cuantitativa", y="Frecuencia absoluta")+ 
  # debemos especificar el mismo binwidth que para el histograma
  geom_freqpoly(binwidth=5, color="red",linetype=2) 

Para pintar la densidad de la distribución usaríamos geom_density. Lo podemos hacer junto con el histograma de frecuencias relativas, para lo cual debemos especificar en el histograma la opción aes(y=after_stat(density)). Usaremos en este ejemplo la variable Edad del data.frame datosTIC.

ggplot(datosTIC)+
  aes(Edad)+
  geom_histogram(aes(y=after_stat(density)),binwidth=5,alpha=0.2,color="red3",fill="green4")+
  geom_density(color="blue2")+
  labs(title="Histograma y Densidad", x="Edad", y="")

Otros ejemplos de gráficos son dotplot. Es adecuado cuando no tenemos muchos datos, así que vamos a usar otro conjunto de datos:

Pintamos el dotplot de la variable y.

ggplot(datos)+
  aes(y)+
  geom_dotplot(binwidth = 5, alpha=0.2, color="red", fill="green",dotsize=0.2)

y gráfico de áreas

ggplot(datos)+
  aes(y)+
  geom_area(stat="bin", binwidth=5,alpha=0.2, color="red", fill="green")

Gráficos para más de una variable

En la gran mayoría de los casos, queremos representar más de una variable. Vamos a mostrar aquí cómo construir las gráficas más usuales.

Diagramas de Dispersión

Los usamos para representar dos variables cuantitativas. Debemos especificar las variables a representar en la orden aes (aes(x,y) por ejemplo). Se generan con el geom geom_point, mientras que la capa geom_smooth nos permite representar la recta de regresión con banda de confianza asociada.

ggplot(datos)+
  aes(x,y)+
  geom_point()+
  geom_smooth(formula=y~x, method="lm",level=0.95) #banda de confianza al 95%

Podemos personalizar la gráfica y agregar más detalles. Por ejemplo, la opción position="jitter" en geom_point añade un ruido aleatorio a los datos para evitar imprimir dos veces el mismo punto. Es útil cuando se repiten mucho los valores.

Otras capas útiles en este tipo de gráficos son stat_regline_equation, que añade a la gráfica la expresión de la recta de regresión y stat_cor, que muestra el coeficiente de correlación lineal R y el P-valor del contraste de correlación lineal.

ggplot(datos)+
  aes(x,y)+
  geom_point(shape=23,color="blue",fill="orange", position="jitter")+
  geom_smooth(formula=y~x, method="lm",level=0.95)+
  stat_regline_equation(label.x=8,label.y=5) + #ecuación recta en la posición (8,5)
  stat_cor(label.x=0,label.y=35)

En ocasiones, nos puede interesar representar en el diagrama una tercera variable cualitativa que distinga distintas categorías. Podemos introducir colores (con color) o formas (shape) para distinguir puntos según esa tercera variable. En nuestro caso, será d la que juegue ese papel. Así, podemos representar nuestro conjunto de esta manera:

ggplot(datos)+
  aes(x,y,shape=d)+
  geom_point()+
  labs(title="Diagrama de dispersión",x="x",y="y",font=2)+
  scale_shape(name="Forma")+ #modifica la leyenda
  theme(legend.position = "top") #para poner la leyenda en la posición superior
## Ignoring unknown labels:
## • font : "2"

En este último gráfico hemos modificado la leyenda con el comando `scale_colour_discrete() y la posición de la misma con theme(legend.position=".."). Observamos que el factor d debe tenerse en cuenta a la hora de ajustar la recta de regresión lineal. Podemos pintar cada una de las rectas de regresión y mostrar su ecuación:

ggplot(datos)+
  aes(x=v1,y=v2,color=d)+
  geom_point()+
  labs(title="Diagrama de dispersión",x="x",y="y",font=2)+
  scale_colour_discrete(name="Tipo",labels=c("A","B","C","D","E"))+
  theme(legend.position = "top")+
  geom_smooth(aes(x,y,color=d),formula=y~x, method="lm")+
  stat_regline_equation(label.x=c(0,0,0,0,0),
                        label.y=c(40,36,32,28,24))+
  theme_minimal() #modificamos el estilo del gráfico
## Ignoring unknown labels:
## • font : "2"

Gráficos de líneas

Muy utilizados cuando estamos usando una serie temporal, donde la variable x representa el tiempo. Se construyen con el comando geom_line

ggplot(datos)+
  aes(x,y)+
  geom_line(linetype="dotted",color="blue")+
  labs(title="Gráfico de líneas",x="Tiempo", y="Variable y")

Puede ser útil representar líneas por categorías

ggplot(datos)+
  aes(x,y,d)+
  geom_line(aes(color=d))+
  scale_colour_discrete(name="Tipo",labels=c("A","B","C","D","E"))+
  labs(x="Tiempo",y="Variable a estudiar")

Boxplots

En este caso, la variable cualitativa se sitúa en el eje X, y la cuantitativa en el eje Y. Vamos a usar las variables d e y

ggplot(datos)+
  aes(x=d,y=y)+
  geom_boxplot(aes(color=d))+
  labs(title="Boxplot",x="Clases",y="y")

Podemos tratar de replicar las gráficas para comparar la Edad frente al Sexo en los datosTIC, como hicimos ayer, y veremos que con esta gramática es mucho más sencillo:

ggplot(datosTIC)+
  aes(x=Sexo,y=Edad)+
  geom_boxplot(aes(color=Sexo))

Podemos incluir los datos en la gráfica mediante geom_point() o geom_jitter(), que añade una pequeña variación en la localización de los datos, con el fin de que los valores que sean iguales, también se representen. De nuevo, esto es adecuado para conjuntos con no muchos datos.

ggplot(datos)+
  aes(x=d,y=y)+
  geom_boxplot(aes(fill=d))+
  geom_jitter(position = position_jitter(width = .1),color="blue1")+ 
#width establece la desviación
  labs(title="Boxplot",x="Clases",y="y")

Histogramas

Es de nuevo sencillo poder representar histogramas para una variable cuantitativa, distinguiendo por categorías.

ggplot(datosTIC)+
  aes(x=Edad,fill=Sexo)+
  geom_histogram(binwidth=5,alpha=0.2,color="green3")

Sin embargo, este es el histograma apilado (monta los histogramas uno encima del otro). Para superponer los histogramas debemos dar el argumento position="identity" en el comando geom_histogram.

ggplot(datosTIC)+
  aes(x=Edad,fill=Sexo)+
  geom_histogram(binwidth=5,alpha=0.2,color="black",position="identity")

Podemos añadir el polígono de frecuencias

ggplot(datosTIC)+
  aes(x=Edad,fill=Sexo)+
  geom_histogram(binwidth=5,alpha=0.2,color="black",position="identity")+
  geom_freqpoly(binwidth=5,aes(color=Sexo),linewidth=1)+
  labs(title="Histograma",x="Edad",y="")+
  guides(colour="none")+
  theme_minimal()

o la densidad, con el histograma de frecuencias relativas:

ggplot(datosTIC)+
  aes(x=Edad,fill=Sexo,color=Sexo)+
  geom_histogram(aes(y=after_stat(density)),bins=20,alpha=0.2,position="identity")+
  geom_density(alpha=0.1)+
  labs(title="Histograma",x="Edad",y="")+
  guides(colour="none")+
  theme_minimal()

Diagramas de Barras para más de una variable

Podemos representar los diagramas de barras usuales, Usaremos los datos TIC

ggplot(datosTIC, aes(x=Confianza,fill=UsoInternet))+
  geom_bar()

El comando facet_wrap nos permite separar los gráficos en un panel según una variable cualitativa, como el Sexo.

ggplot(datosTIC, aes(x=Confianza,fill=UsoInternet))+
  geom_bar()+
  facet_wrap(vars(Sexo))

En este caso, solo tenemos dos categorías, pero podríamos elegir la forma del panel de gráficos con las opciones ncol y nrow. Podemos también modificar los nombres de las etiquetas, para que quede más estético. Los comandos scale_x_discrete, scale_x_continuous, (lo mismo con la variable y)

ggplot(datosTIC, aes(x=Confianza,fill=UsoInternet))+
  geom_bar()+
  scale_x_discrete(label=c("Mucho","Bastante","Poco","NA"))+
  scale_y_continuous(breaks=seq(0,3500,500))+
  facet_wrap(vars(Sexo),ncol=1)

Diagramas de violín

Este tipo de representaciones permiten comparar a la vez la forma de la distribución (en su forma básica, se pinta la densidad de los datos a ambos lados del eje vertical), pero también se pueden incluir los boxplots, o los datos. Permiten hacer comparaciones de forma muy rápida y sencilla entre grupos sin prescindir de los detalles. Lo obtenemos con la función geom_violin(). Al igual que en los boxplots, podemos situar en el eje X una variable cualitativa, para hacer comparaciones.

Una gráfica sencilla inicial sería esta:

ggplot(datos)+
  aes(x=d,y=y)+
  geom_violin(aes(fill=d),alpha=0.5)+
  labs(title="Diagrama de violín",x="d",y="Variable")+
  theme_bw()

Podemos incluir una tercera variable para categorizar:

ggplot(datos)+
  aes(x=f,y=y,color=d)+
  geom_violin(aes(fill=d),alpha=0.5)+
  labs(title="Diagrama de violín",x="Factor",y="Variable")

Podemos usar opciones como el comando position="identity" para superponer las gráficas.

ggplot(datos)+
  aes(x=f,y=y,color=d)+
  geom_violin(aes(fill=d),alpha=0.5, position="identity")+
  labs(title="Diagrama de violín",x="Factor",y="Variable")

El comando coord_flip() permite rotarlos

ggplot(datos)+
  aes(x=f,y=y,color=d)+
  geom_violin(aes(fill=d),alpha=0.5, position="identity")+
  coord_flip()+
  labs(title="Diagrama de violín",x="Factor",y="Variable")

Como comentamos anteriormente, se puede agregar a la gráfica sin mucho esfuerzo el boxplot, lo cual nos permite visualizar mejor la distribución de los datos. Veamos una gráfica del nivel de confianza en el uso de las TIC según la edad del encuestado.

g=ggplot(datosTIC)+
  aes(x=Confianza,y=Edad,fill=Confianza)+
  geom_violin(alpha=0.2)+
  geom_boxplot(linewidth=0.5)+
  labs(title="Nivel de confianza según la Edad",x="Confianza en las TIC",y="Edad")
g

Podemos apreciar que la mayor parte de los datos faltantes se dan en individuos mayores. Para identificarlos mejor, modifiquemos las etiquetas del eje Y.

summary(datosTIC$Edad) ###miramos el rango de la Edad
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   16.00   42.00   55.00   54.93   69.00  101.00
g+ 
  scale_y_continuous(breaks = seq(15, 115, by = 5)) 

Ahora podemos apreciar que la mayoría (el 75%) de los datos faltantes corresponden a individuos mayores de 70 años (aproximadamente). Para que no se nos muestren los datos faltantes, podemos pedir que represente el subconjunto de datos que no tomen el valor NA. También vamos a reordenar los niveles, para que tengan más sentido.

datosTIC$Confianza<-factor(datosTIC$Confianza, 
                     levels = c("Mucho","Bastante","Poco o nada"))
ggplot(subset(datosTIC, !is.na(Confianza)))+
  aes(x=Confianza,y=Edad,fill=Confianza)+
  geom_violin(alpha=0.2)+
  geom_boxplot()+
  labs(title="Nivel de confianza según la Edad",x="Confianza en las TIC",y="Edad")

Podemos mostrar solo líneas que representan los percentiles 5%, 25%, 50%, 75% y 95%.

ggplot(subset(datosTIC, !is.na(Confianza)))+
  aes(x=Confianza,y=Edad,fill=Confianza)+
  geom_violin(alpha=0.5,draw_quantiles =      c(0.05,0.25,0.50,0.75,0.95),linetype=3,color="magenta",linewidth=0.5)+
  labs(title="Nivel de confianza según la Edad",x="Confianza en las TIC",y="Edad")+
  theme(axis.title.x = element_text(size = 15,
                                  color = "blue",
                                  face = "bold")) 
## Warning: The `draw_quantiles` argument of `geom_violin()` is deprecated as of ggplot2
## 4.0.0.
## ℹ Please use the `quantiles.linetype` argument instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

También podemos pedir que se pinten los violines con tamaños proporcionales al tamaño de la muestra. Puede ser útil cuando los grupos tienen valores muy dispares, como es este caso.

ggplot(subset(datosTIC, !is.na(Confianza)))+
  aes(x=Confianza,y=Edad,fill=Confianza)+
  geom_violin(alpha=0.5,scale="count", 
              draw_quantiles = c(0.05,0.25,0.50,0.75,0.95),
              linetype=3,color="magenta",linewidth=0.5)+
  labs(title="Nivel de confianza según la Edad",x="Confianza en las TIC",y="Edad")

Agregar etiquetas dentro de los gráficos

Aunque ya hemos visto cómo modificar las etiquetas de los ejes, o cambiar el título, también podemos incluir texto dentro de la gráfica (similar a cuando hemos puesto las rectas de regresión), con la capa geom_text. Puede ser útil calcular los tamaños de las muestras e incluirlos en la gráfica

ggplot(subset(datosTIC, !is.na(Confianza)))+
  aes(x=Confianza,y=Edad,fill=Confianza)+
  geom_violin(alpha=0.5,scale="count", 
              draw_quantiles = c(0.05,0.25,0.50,0.75,0.95),
              linetype=3,color="magenta",linewidth=0.5)+
  labs(title="Nivel de confianza según la Edad",x="Confianza en las TIC",y="Edad")+
  geom_text(x=1,y=97,label=paste("n=",table(datosTIC$Confianza)[1]),
            stat="unique",size=3,color="blue2")+
  geom_text(x=2,y=97,label=paste("n=",table(datosTIC$Confianza)[2]),
            stat="unique",size=3,color="blue2")+
  geom_text(x=3,y=97,label=paste("n=",table(datosTIC$Confianza)[3]),
            stat="unique",size=3,color="blue2")

Guardar los gráficos

Para guardar los gráficos creados, podemos situar el cursor sobre el gráfico y darle a guardar, con la extensión que prefiramos, o usar el comando ggsave("Nombre fichero", ggplot).

g=ggplot(datos)+
  aes(x=f,y=y,color=d)+
  geom_violin(aes(fill=d),alpha=0.3,position="identity")+
  #superpone los diagramas de violín para cada factor
  labs(title="Diagrama de violín",x="Factor",y="Variable")+
  theme_bw()
# ggsave("grafica.pdf", g) 
g

El comando position="identity" se puede usar con otros gráficos, como el histograma. Usamos aquí como ejemplo un conjunto de datos disponible en la librería base de R, llamado iris, que recoge medidas de las flores de tres variedades distintas de lirios, que se clasifican mediante la variable Species. Representamos la variablePetal.Length, que es la medida del largo de los pétalos.

ggplot(iris)+
  aes(Petal.Length,fill=Species)+
  geom_histogram(binwidth=0.25,alpha=0.5, position="identity")+
  geom_freqpoly(binwidth=0.25,aes(color=Species))+
  labs(title="Longitudes de pétalos de iris por especie",x="Longitudes",y="Recuento")

Combinar gráficos

Finalmente, podemos colocar múltiples gráficos en un mismo archivo, con el comando ggarrange de la librería `ggpubr

g1=ggplot(iris)+
  aes(Petal.Length,fill=Species)+
  geom_histogram(binwidth=0.25,alpha=0.5, position="identity")+
  geom_freqpoly(binwidth=0.25,aes(color=Species))+
  labs(title="Longitudes de pétalos",x="",y="")
g2=ggplot(iris)+
  aes(Petal.Width,fill=Species)+
  geom_histogram(binwidth=0.25,alpha=0.5, position="identity")+
  geom_freqpoly(binwidth=0.25,aes(color=Species))+
  labs(title="Anchuras de pétalos",x="",y="")
g3=ggplot(iris)+
  aes(Sepal.Length,fill=Species)+
  geom_histogram(binwidth=0.25,alpha=0.5, position="identity")+
  geom_freqpoly(binwidth=0.25,aes(color=Species))+
  labs(title="Longitudes de sépalos",x="",y="")
g4=ggplot(iris)+
  aes(Sepal.Width,fill=Species)+
  geom_histogram(binwidth=0.25,alpha=0.5, position="identity")+
  geom_freqpoly(binwidth=0.25,aes(color=Species))+
  labs(title="Anchuras de sépalos",x="",y="")
ggarrange(g1,g2,g3,g4,ncol=2,nrow=2,common.legend=TRUE)

Otra opción es usar el comando + del paquete patchwork

g1+g2+g3+g4