Cargamos las librerías que usaremos:
library(ggplot2)
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(tidyr)
#Cargar datos:
data("diamonds")
Como es bien sabido, un gráfico de dispersión es una forma de representar en un plano cartesiano la relación entre dos variables continuas1. De esta forma podemos representar visualmente el grado de asociación entre ambas.
#Peso y precio:
ggplot(diamonds, aes(x= carat, y= price))+
geom_point()
Incluir otra variable para filtrar, especialmente una variable factor
o de carácter nominal u ordinal es posible en ggplot mediante
usar la opción color= X dentro de la función
aes() en donde X es la variable factor que
utilizaremos para desagregar.
ggplot(data = diamonds, aes(x=carat, y=price, color=color))+
geom_point()
ggplot(diamonds, aes(x=carat, y=price, color=color, size=table))+
geom_point()
ggplot(diamonds, aes(x= carat, y=price, color= color, size= table))+
geom_point()+ facet_wrap(~cut)
ggplot(diamonds, aes(x= carat, y=price, color= color, size= table))+
geom_point()+ facet_wrap(~cut)+labs(title = "Precio de los diamantes por carat", ytitle = "Precio", xtitle = "calidad")
Los histogramas son una representación gráfica de una variable en forma de barras, normalmente se usan para visualizar la distribución de una variable (por lo generalmente cuantitativa continua). Esta es mostrada en intervalos
La forma más básica de ello es mediante la siguiente estructura de código:
Gráfico <-ggplot(datos, aes(X,Y))+ geom_histogram()
Ahora mismo hacemos un gráfico histograma del precio de la base de datos diamonds: La distribución de los precios de los diamantes tiene un comportamiento asimétrico hacia la derecha.
ggplot(diamonds, aes(price))+
geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
p500<- ggplot(diamonds, aes(price))+
geom_histogram(binwidth = 500, fill = "white", color= "black")+
labs(title = "Binwidth = 500")
p1000<-ggplot(diamonds, aes(price))+
geom_histogram(binwidth = 1000, fill= "white", color= "black")+
labs(title = "Binwidth= 1000")
p1500 <- ggplot(diamonds, aes(price))+
geom_histogram(binwidth = 1500, fill= "white", color = "black")+
labs(title = "Binwidth= 1500")
#install.packages("gridExtra") para unir los tres gráficos:
library(gridExtra)
##
## Attaching package: 'gridExtra'
## The following object is masked from 'package:dplyr':
##
## combine
grid.arrange(p500, p1000, p1500, ncol= 3)
Ahora usaremos una variable cut que indica la calidad del corte del
diamante. Algo importante para lograr comparaciones por grupos usando
histogramas es usando en la capa geom_histogram, dentro del paréntesis,
el comando position= “identity”, alpha= 0.5. Para colocar las
comparaciones se usa ggplot(data, aes(Y, fill= X)), siendo
X la variable de agrupación.
ggplot(diamonds, aes(price, fill=cut))+
geom_histogram(position = "identity", alpha= 0.5)+
labs(x="Price", y= "Count")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Otra forma de utilizar la posición de una manera tal que el gráfico sea más entendible (en comparación con el gráfico anterior) es cambiar los comandos respecto a la posición y el bindwidth:
ggplot(diamonds, aes(price, fill=cut))+
geom_histogram(binwidth = 1500, position = "dodge")
Los gráficos de barras se utilizan para mostrar comparaciones entre distintas categorías de una variable. Por lo general, en el eje X se muestran diferentes categorías que comparamos y el eje Y es el valor medido. Mientras más alta es la barra, mayor es el valor medido. Partiendo de la siguiente función en la que x representa una variable aleatoria y k un conjunto de atributos relacionados a dicha variable aleatoria (categorías), podemos describir matemáticamente una tabla de frecuencias con la siguiente fórmula:
\[f(x,k)= \sum^{n,k}_{i=1,k}x_{i,k}\]
Es básicamente la sumatoria de los casos que pertenecen a la variable
x en la categoría k. Y podemos representarlo gráficamente en Rstudio
mediante el siguiente comando:
ggplot(data, aes(X,Y))+ geom_bar() . Como ejemplo podemos
hacer uso de la variable colors que se encuentra en la base de
datos diamond para hacer un gráfico de barras:
#Gráfico de barras:
ggplot(diamonds, aes(color))+geom_bar()+ labs(title= "Gráfico de barras, color:")
El gráfico anterior nos da el conteo o la frecuencia absoluta de cada categoría, en Rstudio podemos cambiar el sentido (poner las barras en vertical y no en horizontal)al gráfico como veremos a continuación:
ggplot(diamonds, aes(color))+
geom_bar()+
coord_flip()
Otro elemento, al igual que las otras gráficas vistas anteriormente, es que podemos personalizarlas. Como veremos con este ejemplo:
ggplot(diamonds, aes(color))+
geom_bar(fill="blue", color= "black")+
theme_minimal()+
labs(title= "Gráfico de barras~ Color del diamante", subtitle = "Datos del conjunto de datos diamonds de la librería ggplot2")
Otro aspecto importante que es posible hacer en Rstudio es girar y cambiar el ángulo y posición de las leyendas en el gráfico. Podemos hacerlo con el siguiente código:
ggplot(diamonds, aes(color))+
geom_bar(fill= "red", color="blue")+
theme_minimal()+
labs(title = "Gráfico de barras ~ Color del diamante", subtitle = "Datos del conjunto de diamonds de la librería ggplot2")+
theme(plot.title = element_text(size=20),
axis.title = element_text(size=16),
axis.title.y = element_text(angle = 0),
axis.title.x = element_text(hjust = 1)) #1:Derecha; 0:izquierda; 0.5: centralizado.
Es posible estimar el conteo condicional de una variable en relación a otra (podríamos expresarlo con la siguiente fórmula):
\[ P(A|B)= \frac{P(A \cap B)}{P(B)} \]
library(ggplot2)
library(dplyr)
#Primero, estimar la proporción de diamantes:
diamonds_p <- diamonds %>%
count(color, cut) %>%
group_by(color) %>%
mutate(prop= n/sum(n)*100)
#Ahora el gráfico debe de hacerse así:
ggplot(diamonds_p, aes(color, prop, fill=cut))+
geom_bar(stat = "identity")+
theme_minimal()+
labs(title= "Gráfico de color por tipo de corte del diamante", subtitle ="Datos extraidos de la base de datos diamonds del paquete ggplot2")
Ahora bien, si queremos la versión del gráfico sin proporción debemos poner lo siguiente:
ggplot(diamonds, aes(color, fill=cut))+
geom_bar()+
theme_minimal()+
labs(title= "Gráfico de color por tipo de corte del diamante", subtitle ="Datos extraidos de la base de datos diamonds del paquete ggplot2")
Si buscamos incluir un gráfico de barras agrupado de otra manera podemos hacerlo así:
ggplot(diamonds, aes(color, fill= cut))+
geom_bar(position = position_dodge(preserve = "single"))+
theme_minimal()
Este tipo de gráficos representa datos compuestos por puntos conectados por segmentos lineales. Son comúnmente usados en contextos de series temporales y datos de panel. La estructura lógica de la sintaxis usando ggplot2 es:
gráfico_lineas<- ggplot(datos, aes(X,Y))+
geom_line
En este apartado usaremos la base de datos “sacramento”. Antes que
nada, buscar información sobre la base de datos:
#Hay que instalar el paquete caret:
library(caret)
data("Sacramento")
Luego de hacer uso de la base de datos Sacramento, la cual tiene datos de series de tiempo, más idónea para este tipo de gráfico, procedemos a realizar un análisis de tendencia de los preciso de los condominios en Sacramento:
Sacramento_condo <- Sacramento %>%
filter(type=="Condo")
#Gráfico básico de líneas:
ggplot(Sacramento_condo, aes(x= sqft, y= price))+geom_line()+geom_smooth(method = "lm")
## `geom_smooth()` using formula = 'y ~ x'
Es posible cambiar los colores, como vimos anteriormente en los otros
tipos de gráficos, al usar el subcomando color
ggplot(Sacramento_condo, aes(x= sqft, y=price, color= "red"))+geom_line()+geom_smooth(method = "lm", color= "brown")
## `geom_smooth()` using formula = 'y ~ x'
ggplot(Sacramento_condo, aes(x=sqft, y=price, color=factor(beds)))+geom_line()
Como vimos anteriormente, pudimos crear un gráfico de líneas que nos
dicen que las casas de una sola habitación tienen menos metros cuadrados
que aquellas que las de tres. Si queremos modificar el gráfico, por
ejemplo, cambiar el grosor de las líneas, se utiliza el comando
geomline(size= x)2 siendo x el tamaño deseado3.
ggplot(Sacramento_condo, aes(x=sqft, y=price, color=factor(beds)))+geom_line(linewidth= 1.5)
Los diagramas de caja es una representación de datos estadísticos,
podemos representar gráficamente el mínimo, el primer cuartil, la
mediana, el tercer cuartil y el máximo de los datos. El gráfico en
Rstudio podemos representarlo de la siguiente manera:
gráfico<- ggplot2(datos, aes(X,Y))+ geom_boxplot() .
Algunas de las características de la caja son:
La caja se extiende desde el primer cuartil (o percentil 25) de la distribución hasta el tercer cuartil (o percentil 75), una distancia conocida como el rango intercuartílico (IQR).
La línea del centro de la caja representa la mediana, es decir, el segundo cuartil (o percentil 50) de la distribución.
Existen líneas o bigotes a cada lado de la caja hasta el valor más alejado de la distribución.
Los valores mayores a 1.5 veces el IQR, desde cualquier borde de la caja, se llaman valores atípicos o inusuales, porque su comportamiento escapa al de la mayoría de puntos.
Otro elemento a destacar es las muescas. En estos
las muescas se extienden a \(\frac{1.58*IQR}{\sqrt{(n)}}\). Esto permite
un intervalo de confianza de 95% para comparar las medianas de dos o más
grupos en el diagrama de caja [Mcgill, Tukey, y
Larsen (1978)]4.
Usando la función ggplot construimos un diagrama de cajas básico usando la siguiente función:
ggplot(diamonds, aes(x= cut, y= price, color= "red"))+
geom_boxplot()
Usando el comando o la capa coord_flip() puedes pasar de
vertical a horizontal:
ggplot(diamonds, aes(x=cut, y=price))+
geom_boxplot()+
coord_flip()
ggplot(diamonds, aes(x= cut, y= price, fill=color))+
geom_boxplot()
Los gráficos son un arma muy poderosa en términos de su capacidad de hacer resúmenes de datos, así como describir o explicar propiedades de estos ante un problema dado. Por eso hay una serie de tips importantes que debes de tomar en cuenta siempre antes de hacer un gráfico. Los que podríamos considerar son:
El destinatario (a quién va dirigido el gráfico): No es lo mismo un boletín de una dirección acerca de asuntos coyunturales sobre pobreza y desigualdad que un reporte de investigación. El primero va dirigido a un público menos especializado que el primero.
La pregrunta que debemos responder: La pregunta nos ayuda a pensar en qué gráfico es más adecuado para la cuestión. Para series de tiempo podemos usar un gráfico de líneas o podemos usar un boxplot para poder ver desde su justa dimensión la heterogeneidad de los datos entre individuos en contextos de datos de panel o de diseños longitudinales con corte transversal.
El tipo de gráfico a realizar: el tipo de gráfico depende de muchos elementos. El grupo a analizar, el tipo de dato (si es escalar, cualitativo ordinal o nominal, etc.). Siempre tomar encuenta esto para evitar crear un gráfico saturado que no sea comprendido por quienes lo vayan a leer, especialmente lectores que no son expertos en estadística o en métodos cuantitativos.
La claridad del mensaje: Es bueno procuprar que las leyendas de los títulos del gráfico sean lo suficientemente claras, además del contenido efectivo del gráfico. Me refiero es a los símbolos, los colores, números y escala del mismo, así como la manera de representar categorías en caso de existir variables cualitativas por las cuales desagregar el dato en el la misma.
Estilo propio: No es un pecado tratar de personalizar tus gráficos.
Pero recuerda que el obejtivo final es siempre que el gráfico informe lo que debe de informar, así como poder tomar decisiones a través de este (dependiendo del contexto.
Las leyendas en los mismos nos permiten identificar las distintas
variables o categorías que ilustramos por medio de los gráficos. El
paquete ggplot2 permite colocar leyendas de manera fácil,
aunque ya de por si viene con unas de gráfica (con los nombres de las
variables). Para modificar títulos de las mismas y leyendas se utiliza
la capa labs(). Ejemplo:
+ labs(title= "Título del gráfico, subtitle= "Subtítulo del gráfico,y= "Nombre de la variable Y",x= "Nombre de la variable X",color= "Nombre de la variable Color a usar",size= "Nombre de la variable SIZE",caption= "Título interior del gráfico")
Al principio hicimos un gráfico de dispersión y desagregamos este por el color del diamante en la sección 1. Ahora veamos como se observa con todas las etiquetas y leyendas.
ggplot(data = diamonds, aes(x=carat, y=price, color=color))+
geom_point()+
labs(title= "Distribución del precio del diamante",
subtitle = "Características más importantes que influyen en el precio",
y= "Precio del diamante",
x= "Peso del diamante",
color= "Color del diamante",
caption= "Elaborado por @mella10g")
Estos elementos permiten personalizar el fondo del gráfico, esto
permite dar una estética del gráfico según tu conveniencia. El “canvas”
se puede modificar con la capa theme() . Adicionalmente
existe un paquete llamado ggthemes que permite añadir otra
serie de fondos adicionales cuando usas la función ggplot.
Siguiendo el ejemplo anterior de la librería diamonds
vamos a cambiar el fondo del gráfico de dispersión:
ggplot(data = diamonds, aes(x=carat, y=price, color=color))+
geom_point()+
labs(title= "Distribución del precio del diamante",
subtitle = "Características más importantes que influyen en el precio",
y= "Precio del diamante",
x= "Peso del diamante",
color= "Color del diamante",
caption= "Elaborado por @mella10g")+
theme_dark()
En este otro ejemplo usaremos otro tema de gráficos,
theme_light():
ggplot(diamonds, aes(x=carat, y=price, color=color))+
geom_point()+
labs(title= "Relación entre precio y peso del diamante",
subtitle = "Características que inciden en el precio",
y= "Precio del diamante, en US",
x= "Peso del diamante, en gramos",
color= "Color del diamante (D= mejor, J= Peor)",
caption= "Elaborado por @mella10g")+
theme_light()
Una forma de guardar gráficos, después de realizados para fines de
informe, podemos usar la función ggsave(). Argumentos:
filename: Directorio, nombre y formato. Este admite los siguientes: png, eps, ps, text, pdf, jpeg, tiff, bmp, svg o wmf.
plot: Gráfico que vamos a guardar.
dpi: Resolución del gráfico. Este puede ser “retina (320),”print” (300) o “screen” (72.
Width y height: Ancho y altura del gráfico.
El gráfico se graba con la siguiente función:
ggsave(filename = "Gráfico.png", plot= graf, dpi= 300)5
A continuación tenemos un gráfico que hemos guardado en el objeto
dispersion_ejemplo para fines didácticos:
dispersion_ejemplo<- ggplot(diamonds, aes(x= carat, y= price, color=color))+
geom_point()+
labs(title= "Relación entre precio y peso del diamante",
subtitle = "Características que inciden en el precio",
y= "Precio del diamante, en US",
x= "Peso del diamante, en gramos",
color= "Color del diamante (D= mejor, J= Peor)",
caption= "Elaborado por @mella10g")+
theme_light()+
geom_hline(yintercept = 10000, color="red", linetype= "dotted", linewidth= 1)+
geom_vline(xintercept= 3, color= "red", linetype= "dotted", linewidth = 1)+
annotate("text", x=4, y=10700, label= "Diamantes más caros")+
annotate("text", x=2, y=0, label= "Diamantes más baratos")
dispersion_ejemplo
Ahora para grabar:
ggsave("dispersion_ejemplo.png", plot=dispersion_ejemplo, dpi=320)
## Saving 7 x 5 in image
Dentro de las que podemos mencionar está STHDA, así como la fuente de los títulos. Otras fuentes para abundar en grabar gráficos ya esa usando ggsave o mediante tidyverse, o usando otras formas hacer click aquí.
Es posible más de una variable como detallaremos más adelante.↩︎
Siempre y cuando tu versión de ggplot2 sea previa a la
3.4.0, posterior a esta se utiliza el comando
geom_line(linewidth= x)↩︎
Para más info para lograr mayor nivel de personalización de gráficos de líneas puedes consultar aquí.↩︎
Para una variable continua es posible usar en Rstudio
otros tipo de capas como geom_quantile() ,
geom_violin() o geom_jitter() , especialmente
para datos pequeños.↩︎
Si no especificamos el nombre del gráfico, ggsave nos guardará el último gráfico que hemos realizado.↩︎