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
,…
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")
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 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")
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.
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"
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")
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")
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()
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)
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")
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")
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")
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