Siempre es importante realizar visualizaciones de los conjuntos de datos que consideremos importantes. Las visualizaciones ayudan a las personas a entender las historias detrás de los datos, y también a entender la composición del conjunto en general. A través de una visualización, podemos darnos cuenta rápidamente de cómo se distribuyen los valores, cuál es su dispersión, si existen sesgos, o si hay valores extraños dentro de nuestro conjunto.
Carguemos una base de datos con resultados de un examen de conocimientos en el estado de Veracruz, y visualicemos el comportamiento de la variable ACIERTOS. Esto puede hacerse con funciones base de R, por ejemplo, plot()
df <- read.csv("resultados1.csv")
plot(df$ACIERTOS)
Cómo podemos observar, esta visualización no tiene la mejor presentación. Quizá sería más conveniente usar la función hist() para hacer un histograma
hist(df$ACIERTOS)
Esta visualización probablemnte representa mejor lo que queremos comunicar con nuestra información, pero aún así podríamos mejorar su presentación usando los diferentes argumentos de la función hist().
hist(df$ACIERTOS,
main = "Histograma de aciertos",
xlab = "Aciertos",
ylab = "Frecuencia",
cex.axis = .8,
cex.lab = 1.5,
cex.main = 2,
font.main = 8)
Aún así, trabajar con visualizaciones en R base puede ser complicado y el resultado no siempre es estético. Mi recomendación es utilizar el paquete especializado en gráficos ggplot2. Este paquete ya está incluido dentro de la paquetería de tydiverse, por lo que puedes simplemente llamar tydiverse, usando la función library().
library(tidyverse)
El paquete ggplot2 se define como una gramática para las visualizaciones. Las visualizaciones se construyen a partir de un enunciado base que puede ir sumando componentes y enunciados subordinados. La función principal del paquete es ggplot(), la cual crea un objeto ggplot que puede ser dibujado en un plano bidimensional. Comencemos desarrollando un enunciado principal, en el que la variable ACIERTOS de nuestra base de datos df se distribuirá a lo largo del eje x de la gráfica.
df %>%
ggplot(aes(x = ACIERTOS))
Como pueden ver, no pasa nada al ejecutar esta línea. Esto es porque al enunciado principal debemos asignarle una geometría particular. En este caso, la geometría que corresponde a un histograma. Asignemos una capa de geometría al enunciado principal usando el operador +. Adicionalmente, solicitemos que cada barra en el histograma corresponda a un cambio igual a +1 en el eje x.
df %>%
ggplot(aes(x = ACIERTOS)) +
geom_histogram(binwidth = 1) #modificando el valor que abarca cada barra
Procedamos ahora a cambiar los títulos y etiquetas de la visualización. Hacemos esto añadiendo la capa de etiquetas con la función labs().
df %>%
ggplot(aes(x = ACIERTOS)) +
geom_histogram(binwidth = 1)+
labs(x = "Aciertos", y = "Frecuencia", title = "Distribución de aciertos en el examen", caption = "Elaboración propia")
Podemos modificar los colores de la geometría que se visualiza usando los argumentos color y fill. El primero modifica el color de líneas y puntos, mientras que el segundo modifica el color del relleno. También podemos agregar cierta transparencia usando el argumento alpha().
df %>%
ggplot(aes(x = ACIERTOS)) +
geom_histogram(binwidth = 1, color = "white", fill = "magenta", alpha = .5)+
labs(x = "Aciertos", y = "Frecuencia", title = "Distribución de aciertos en el examen", caption = "Elaboración propia")
Observamos que la variable ACIERTOS es una variable con comportamiento continuo, aunque tiene límites en 0 y 100. Podemos modificiar la presentación del eje x como mejor convenga a nuestros intereses de comunicación con la función scale_x_continuous(), usando el argumento breaks para cambiar el número de marcas del eje, y el argumento labelspara cambiar sus etiquetas.
df %>%
ggplot(aes(x = ACIERTOS)) +
geom_histogram(binwidth = 1)+
labs(x = "Aciertos", y = "Frecuencia", title = "Distribución de aciertos en el examen", caption = "Elaboración propia")+
scale_x_continuous(breaks = seq(0,100,20), labels = paste(seq(0,100,20), "puntos"))
También podemos asignar límites a la gráfica para visualizar solamente una parte del eje, usando el argumento limits.
df %>%
ggplot(aes(x = ACIERTOS)) +
geom_histogram(binwidth = 1)+
labs(x = "Aciertos", y = "Frecuencia", title = "Distribución de aciertos en el examen", caption = "Elaboración propia")+
scale_x_continuous(breaks = seq(0,100,20), labels = paste(seq(0,100,20), "puntos"), limits = c(60,90))
## Warning: Removed 1967 rows containing non-finite values (stat_bin).
## Warning: Removed 2 rows containing missing values (geom_bar).
Tenemos en este punto, dos alternativas. Una de ellas es “degradar” la variable continua en la gráfica, mediante el uso del argumento labels.
df %>%
ggplot(aes(x = ACIERTOS)) +
geom_histogram(binwidth = 1)+
labs(x = "Desempeño", y = "Frecuencia", title = "Distribución de aciertos en el examen", caption = "Elaboración propia")+
scale_x_continuous(breaks = seq(0,100,25), labels = c("Muy malo", "Malo", "Regular", "Bueno", "Muy bueno"))
La otra opción consiste en “degradar” la variable sobre la base de datos, antes de pasarla a la función ggplot. Este ejemplo nos será útil para observar cómo podemos encadenar la función ggplot usando los tubos de tidyverse. Además, dado que la variable en el eje x ya no es continua, deberemos usar la geometría de barras, en lugar de la de histograma.
df %>%
mutate(desempeño = case_when(ACIERTOS < 25 ~ "Muy malo",
ACIERTOS > 24 & ACIERTOS < 50 ~ "Malo",
ACIERTOS > 49 & ACIERTOS < 75 ~ "Bueno",
ACIERTOS > 74 ~ "Muy bueno")) %>%
mutate(desempeño = fct_relevel(desempeño, "Muy malo", "Malo", "Bueno", "Muy bueno")) %>% #Reordenando los valores para que no salgan en orden alfabético en la gráfica
ggplot(aes(x = desempeño))+
geom_bar()+
labs(x = NULL, y = "Frecuencia", title = "Desempeño en el examen" )
Podemos vincular los argumentos de color con el valor de una variable. Combinando nuestras líneas previas, haremos un histograma en donde los colores del relleno de la barras correspondan a un valor cualiativo de desempeño.
df %>%
mutate(desempeño = case_when(ACIERTOS < 25 ~ "Muy malo",
ACIERTOS > 24 & ACIERTOS < 50 ~ "Malo",
ACIERTOS > 49 & ACIERTOS < 75 ~ "Bueno",
ACIERTOS > 74 ~ "Muy bueno")) %>% # Creamos la variable "desempeño"
mutate(desempeño = fct_relevel(desempeño, "Muy malo", "Malo", "Bueno", "Muy bueno")) %>% #Reordenando los valores para que no salgan en orden alfabético en la gráfica
ggplot(aes(x = ACIERTOS, fill = desempeño))+
geom_histogram(binwidth = 1)+
labs(x = NULL, y = "Frecuencia", title = "Desempeño en el examen")
Usemos la función scale_fill_manualpara asignar cualquier color que queramos a la paleta de la visualización. Lo códigos hexadecimales de los colores podemos consultarlos en https://htmlcolorcodes.com/es/
df %>%
mutate(desempeño = case_when(ACIERTOS < 25 ~ "Muy malo",
ACIERTOS > 24 & ACIERTOS < 50 ~ "Malo",
ACIERTOS > 49 & ACIERTOS < 75 ~ "Bueno",
ACIERTOS > 74 ~ "Muy bueno")) %>% # Creamos la variable "desempeño"
mutate(desempeño = fct_relevel(desempeño, "Muy malo", "Malo", "Bueno", "Muy bueno")) %>% #Reordenando los valores para que no salgan en orden alfabético en la gráfica
ggplot(aes(x = ACIERTOS, fill = desempeño))+
geom_histogram(binwidth = 1)+
labs(x = NULL, y = "Frecuencia", title = "Desempeño en el examen")+
scale_fill_manual(name = NULL, values = c("#ED3C0C", "#EF9342", "#EFE442", "#50A714"))
Hay algunos temas prediseñados para cambiar la apariencia de la visualización. Mi favorito es el tema en blanco y negro theme_bw(), pero también pueden intentarse los valores _grey, _gray, _light, _minimal, _void, _test, y _linedraw.
df %>%
mutate(desempeño = case_when(ACIERTOS < 25 ~ "Muy malo",
ACIERTOS > 24 & ACIERTOS < 50 ~ "Malo",
ACIERTOS > 49 & ACIERTOS < 75 ~ "Bueno",
ACIERTOS > 74 ~ "Muy bueno")) %>% # Creamos la variable "desempeño"
mutate(desempeño = fct_relevel(desempeño, "Muy malo", "Malo", "Bueno", "Muy bueno")) %>% #Reordenando los valores para que no salgan en orden alfabético en la gráfica
ggplot(aes(x = ACIERTOS, fill = desempeño))+
geom_histogram(binwidth = 1)+
labs(x = NULL, y = "Frecuencia", title = "Desempeño en el examen")+
scale_fill_manual(name = NULL, values = c("#ED3C0C", "#EF9342", "#EFE442", "#50A714"))+
theme_bw()
Observemos cuántas personas de diferentes regiones participaron en el examen, mediante un gráfico de barras.
df %>%
ggplot(aes(x = REGION))+
geom_bar()
Podemos observar que las etiquetas de cada región se traslapan. Hay muchas soluciones a esto, pero una de mis favoritas es girar los ejes del gráfico.
df %>%
ggplot(aes(x = REGION))+
geom_bar()+
coord_flip()
Por default, el valor del eje y en los gráficos de barras se refiere a la frecuencia de cada valor (ej. cuántas veces aparece XALAPA en la columna REGION). Utilizando lo que sabemos de las funciones mutate() y group_by(), creemos una nueva tabla de frecuencias y porcentajes.
df %>%
group_by(REGION) %>%
count() %>%
ungroup() %>%
mutate(porc = n/sum(n)*100)
## # A tibble: 27 x 3
## REGION n porc
## <chr> <int> <dbl>
## 1 " ACAYUCAN" 126 3.50
## 2 " ALAMO TEMAPACHE" 101 2.80
## 3 " BOCA DEL RIO" 97 2.69
## 4 " CAMERINO Z" 167 4.64
## 5 " COATEPEC" 152 4.22
## 6 " COATZACOALCOS" 172 4.78
## 7 " CORDOBA" 139 3.86
## 8 " COSAMALOAPAN" 102 2.83
## 9 " COSOLEACAQUE" 81 2.25
## 10 " EMILIANO ZAPATA" 111 3.08
## # ... with 17 more rows
Ahora, encadenemos esa tabla a una visualización en donde el alto de la barra esté dado por el porcentaje de participación que representó cada región. Para ello, usaremos el argumento stat con su valor “identity”.
df %>%
group_by(REGION) %>%
count() %>%
ungroup() %>%
mutate(porc = n/sum(n)*100) %>%
ggplot(aes(x = REGION, y = porc)) +
geom_bar(stat = "identity") +
coord_flip()
Mejoremos la estética del gráfico con un tema y ordenando de mayor a menor las barras con el argumento reorder
df %>%
group_by(REGION) %>%
count() %>%
ungroup() %>%
mutate(porc = n/sum(n)*100) %>%
ggplot(aes(x = reorder(REGION, porc), y = porc)) + #reordenamos la variable REGION de acuerdo a la variable porc
geom_bar(stat = "identity") +
labs(x = NULL, y = "Porcentaje", title = "Participación por regiones en el examen")+
coord_flip()+
theme_bw()
Por último, observemos en cada región la distribución de hombres y mujeres, igualando el argumento fill con la variable SEXO
df %>%
group_by(REGION, SEXO) %>%
count() %>%
ungroup() %>%
mutate(porc = n/sum(n)*100) %>%
ggplot(aes(x = reorder(REGION, porc), y = porc, fill = SEXO)) + #reordenamos la variable REGION de acuerdo a la variable porc y asignamos relleno diferente al sexo
geom_bar(stat = "identity") +
labs(x = NULL, y = "Porcentaje", title = "Participación por regiones en el examen")+
coord_flip()+
theme_bw()
Bueno, ahora sí lo último, intentamos hacer una gráfica con dos ejes x, uno para hombres y otro para mujeres.
df %>%
group_by(REGION, SEXO) %>%
count() %>%
ungroup() %>%
mutate(porc = n/sum(n)*100) %>%
mutate(porc2 = case_when(SEXO == "HOMBRE" ~ porc * -1,
SEXO == "MUJER" ~ porc))%>%
ggplot(aes(x = reorder(REGION, -porc), y = porc2, fill = SEXO)) + #reordenamos la variable REGION de acuerdo a la variable porc y asignamos relleno diferente al sexo
geom_bar(stat = "identity") +
labs(x = NULL, y = "Porcentaje", title = "Participación por regiones en el examen")+
scale_y_continuous(breaks = seq(-10,10,2), limits=c(-10,10), labels = c(seq(10,0,-2), seq(2,10,2)))+
scale_fill_manual(name = "Sexo", labels = c("Hombres", "Mujeres"), values = c("#489E0D", "#970D9E"))+
coord_flip()+
theme_bw()
Este tipo de gráficos es ideal para comparar dispersiones. Dibuja una línea vertical del inicio del primer cuartil al inicio del segundo cuartil, una caja que bordea el segundo y tercer cuartil, una línea horizontal en la mediana, y una línea vertical completa del inicio al final del cuarto cuartil.
df %>%
ggplot(aes(x = SEXO, y = ACIERTOS))+
geom_boxplot()
Por supuesto, esto puede mejorar con algo de color.
df %>%
ggplot(aes(x = SEXO, y = ACIERTOS, fill = SEXO))+
geom_boxplot()
Para no ser redundantes, quitemos la leyenda de la derecha, y algunas etiquetas.
df %>%
ggplot(aes(x = SEXO, y = ACIERTOS, fill = SEXO))+
geom_boxplot(show.legend = F)+
labs(x = NULL, y = NULL, title = "Distribución de aciertos por sexo")+
scale_x_discrete(labels = c("Hombres", "Mujeres"))
Cambiemos los colores usando paletas pre-establecidas por RColorBrewer. Es necesario instalar el paquete y llamarlo con la función library. Las diferentes paletas de RColorBrewer pueden consultarse en https://colorbrewer2.org
library(RColorBrewer)
df %>%
ggplot(aes(x = SEXO, y = ACIERTOS, fill = SEXO))+
geom_boxplot(show.legend = F)+
labs(x = NULL, y = NULL, title = "Distribución de aciertos por sexo")+
scale_x_discrete(labels = c("Hombres", "Mujeres"))+
scale_fill_brewer(palette = "Spectral")+
theme_bw()
Por supuesto, se pueden hacer estas comparaciones de distribución con factores que comprendan más de dos grupos. Pero si tenemos más de 12 colores, primero tenemos que extender una paleta de colores con la función colorRampPalette
coloritos <- colorRampPalette(brewer.pal(11, "Spectral"))(27)
df %>%
ggplot(aes(x = REGION, y = ACIERTOS, fill = REGION))+
geom_boxplot(show.legend = F)+
labs(x = NULL, y = NULL, title = "Distribución de aciertos por región")+
scale_fill_manual(values = coloritos)+
theme_bw()
Reordenando y girando los ejes.
coloritos <- colorRampPalette(brewer.pal(11, "Spectral"))(27)
df %>%
ggplot(aes(x = reorder(REGION, ACIERTOS), y = ACIERTOS, fill = REGION))+
geom_boxplot(show.legend = F)+
labs(x = NULL, y = NULL, title = "Distribución de aciertos por región")+
scale_fill_manual(values = coloritos)+
coord_flip()+
theme_bw()
Carguemos una base de datos con una escala de estrés aplicada a inicios de la pandemia en población latinoamericana
dfst <- read.csv("estres.csv")
Calculemos la puntuación total de estrés sumando la puntuación de cada ítem
dfst <- dfst %>%
rowwise() %>%
mutate(total = sum(c_across(Scale_PSS10_UCLA_1:Scale_PSS10_UCLA_10))) %>%
ungroup()
Realicemos una visualización de puntos donde cada punto es una persona con cierto grado de estrés.
dfst %>%
ggplot(aes(x = X, y = total))+
geom_point()
Cambiemos a una visualización de puntos en donde cada punto varía levemente su posición, para representar mejor la dispersión de los casos.
dfst %>%
ggplot(aes(x = X, y = total))+
geom_jitter()
Evidentemente, mientras más cerca del 50 esté el punto, quiere decir que la persona está más estresada. Usemos una escala de color tipo semáforo, en donde el color verde es poco estrés, y el color rojo, mucho estrés. No olvidemos primero asignar el valor de la variable total al argumento de color en el enunciado principal.
dfst %>%
ggplot(aes(x = X, y = total, color = total))+
geom_jitter()+
scale_color_gradient(low = "green", high = "red", limits = c(10,50))
Retiremos la leyenda y algunas etiquetas para mejorar la visualización. También demos etiquetas cualitativas a la escala en el eje y… Y usemos un tema.
dfst %>%
ggplot(aes(x = X, y = total, color = total))+
geom_jitter(show.legend = F)+
labs(x = NULL, y = NULL, title = "Niveles de estrés en LA")+
scale_y_continuous(labels = c("Muy bajo", "Bajo", "Medio", "Alto", "Muy alto"))+
scale_x_discrete(labels = NULL)+
scale_color_gradient(low = "green", high = "red", limits = c(10,50))+
theme_bw()
En ocasiones, es interesante combinar geometrías. En estos casos, la última geometría cubre a la primera. Pensemos en el siguiente ejemplo, en donde podemos representar la dispersión por sexo de los aciertos en el examen, tanto con puntos como con cajas.
df %>%
ggplot(aes(x = SEXO, y = ACIERTOS, fill = SEXO))+
geom_jitter(aes(color = SEXO), show.legend = F)+
geom_boxplot(show.legend = F)
Agregamos un efecto de transparencia a los puntos y quitamos el outlier en negro de la geometría de cajas.
df %>%
ggplot(aes(x = SEXO, y = ACIERTOS, fill = SEXO))+
geom_jitter(aes(color = SEXO, alpha = 0.5), show.legend = F)+
geom_boxplot(show.legend = F, outlier.shape = NA)
Agregamos a la visualización el resultado de una prueba Wilcoxon y mejoramos en general.
wilcox.test(ACIERTOS~SEXO, df)
##
## Wilcoxon rank sum test with continuity correction
##
## data: ACIERTOS by SEXO
## W = 1894928, p-value < 2.2e-16
## alternative hypothesis: true location shift is not equal to 0
df %>%
ggplot(aes(x = SEXO, y = ACIERTOS, fill = SEXO))+
geom_jitter(aes(color = SEXO, alpha = 0.5), show.legend = F)+
geom_boxplot(show.legend = F, outlier.shape = NA) +
labs(x = NULL, y = NULL, title = "Dispersión de aciertos por sexo", caption = "Prueba Wilcoxon W = 1894928, p < 0.001")+
scale_x_discrete(labels = c("Hombres", "Mujeres"))+
theme_bw()
Cargamos una base de datos de libertad de prensa de Reporteros sin Fronteras, extraemos sólo los datos de México y rotamos la base para que quede en formato limpio: una columna, una variable.
press <- read.csv("data.csv") #Free press
names(press)[1] <- "país"
press2 <- press %>%
filter(país == "MEX") %>%
pivot_longer(cols = 6:24, names_to = "Año", values_to = "valores")
Creamos una visualización inicial que iremos mejorando poco a poco.
press2 %>%
filter(Indicator == "Press Freedom Rank") %>% #Seleccionamos el ranking y no el valor del índice
ggplot(aes(x=Año, y = valores, group= país))+ #Establecemos un grupo para dibujar la geometría de líneas
geom_line(size = 2)+
geom_point(show.legend = F, size = 3)+
labs(x= "Año", y = NULL, title = "Ranking de MEX en libertad de prensa", caption = "Fuente: Reporteros Sin Fronteras")
En un ranking, estar más cerca del primer lugar es mejor, la gráfica debería representar eso, por lo que invertiremos el orden del eje y.
press2 %>%
filter(Indicator == "Press Freedom Rank") %>% #Seleccionamos el ranking y no el valor del índice
ggplot(aes(x=Año, y = valores, group= país))+ #Establecemos un grupo para dibujar la geometría de líneas
geom_line(size = 2)+
geom_point(show.legend = F, size = 3)+
labs(x= "Año", y = NULL, title = "Ranking de MEX en libertad de prensa", caption = "Fuente: Reporteros Sin Fronteras")+
scale_y_reverse()
Por supuesto, las etiquetas del año están traslapadas, y tienen una X al inicio. Es importante notar que en la base de datos no se tienen mediciones para los años 2010 y 2011, eso tiene que considerarse al establecer las etiquetas en el eje X. Observemos cómo las etiquetas giran personalizando la función theme()
press2 %>%
filter(Indicator == "Press Freedom Rank") %>% #Seleccionamos el ranking y no el valor del índice
ggplot(aes(x=Año, y = valores, group= país))+ #Establecemos un grupo para dibujar la geometría de líneas
geom_line(size = 2)+
geom_point(show.legend = F, size = 3)+
labs(x= "Año", y = NULL, title = "Ranking de MEX en libertad de prensa", caption = "Fuente: Reporteros Sin Fronteras")+
scale_y_reverse()+
theme(axis.text.x = element_text(angle = 90, size = 10))+
scale_x_discrete(labels = c(seq(2001, 2009, 1), seq(2012, 2021,1)))
Asignamos el color de los puntos a la variable “valores”, de manera que cambien de verde a rojo, a medida que empeoramos en libertad de prensa, y recordando que el ranking va de 1 a 180.
press2 %>%
filter(Indicator == "Press Freedom Rank") %>% #Seleccionamos el ranking y no el valor del índice
ggplot(aes(x=Año, y = valores, group= país))+ #Establecemos un grupo para dibujar la geometría de líneas
geom_line(size = 2)+
geom_point(aes(color = valores),show.legend = F, size = 3)+
labs(x= "Año", y = NULL, title = "Ranking de MEX en libertad de prensa", caption = "Fuente: Reporteros Sin Fronteras")+
scale_y_reverse()+
theme(axis.text.x = element_text(angle = 90, size = 10))+
scale_x_discrete(labels = c(seq(2001, 2009, 1), seq(2012, 2021,1)))+
scale_color_gradient(low = "green", high = "red", limits = c(1,180))
Señalemos a los responsables de esta debacle mostrando cuando inciaron sus sexenios, usando la función annotate(). Observen cómo es necesario especificar en cada línea de annotate, las coordenadas en x y en y donde queremos que aparezca una anotación. También se observa el uso del argumento cex para cambiar el tamaño de la letra en la anotación.
press2 %>%
filter(Indicator == "Press Freedom Rank") %>% #Seleccionamos el ranking y no el valor del índice
ggplot(aes(x=Año, y = valores, group= país))+ #Establecemos un grupo para dibujar la geometría de líneas
geom_line(size = 2)+
geom_point(aes(color = valores),show.legend = F, size = 3)+
labs(x= "Año", y = NULL, title = "Ranking de MEX en libertad de prensa", caption = "Fuente: Reporteros Sin Fronteras")+
scale_y_reverse()+
theme(axis.text.x = element_text(angle = 90, size = 10))+
scale_x_discrete(labels = c(seq(2001, 2009, 1), seq(2012, 2021,1)))+
scale_color_gradient(low = "green", high = "red", limits = c(1,180))+
annotate(geom = "text", x=1.5, y = 125, label = "Vicente\nFox", cex = 3)+
annotate(geom = "text", x=6, y = 125, label = "Felipe\nCalderón", cex = 3)+
annotate(geom = "text", x=10, y = 125, label = "EPN", cex = 3)+
annotate(geom = "text", x=16, y = 125, label = "AMLO", cex = 3)
Agreguemos un theme personalizado, con el título alineado a la derecha, el fondo blanco, y las líneas secundarias en gris.
press2 %>%
filter(Indicator == "Press Freedom Rank") %>% #Seleccionamos el ranking y no el valor del índice
ggplot(aes(x=Año, y = valores, group= país))+ #Establecemos un grupo para dibujar la geometría de líneas
geom_line(size = 2)+
geom_point(aes(color = valores),show.legend = F, size = 3)+
labs(x= "Año", y = NULL, title = "Ranking de MEX en libertad de prensa", caption = "Fuente: Reporteros Sin Fronteras")+
scale_y_reverse()+
theme(axis.text.x = element_text(angle = 90, size = 10))+
scale_x_discrete(labels = c(seq(2001, 2009, 1), seq(2012, 2021,1)))+
scale_color_gradient(low = "green", high = "red", limits = c(1,180))+
annotate(geom = "text", x=1.5, y = 125, label = "Vicente\nFox", cex = 3)+
annotate(geom = "text", x=6, y = 125, label = "Felipe\nCalderón", cex = 3)+
annotate(geom = "text", x=10, y = 125, label = "EPN", cex = 3)+
annotate(geom = "text", x=16, y = 125, label = "AMLO", cex = 3)+
theme(panel.background = element_rect(fill="white"),
panel.grid = element_line(color="lightgrey"),
axis.ticks = element_line(color="lightgrey"),
plot.title = element_text(hjust=1))
La capacidad de personalización de las visualizaciones con el uso de la función theme() es ilimitada. Para muestra, basta consultar la documentación de ayuda de esta función.
Por último, con RStudio podemos exportar nuestras visualizaciones en diversos formatos. Pensando en publicaciones académicas, recomiendo usar formatos escalables SVG para usuarias y usuarios de Windows, y EPS para quienes trabajan con Mac. En la ventana de visualizaciones sólo hay que dar click en Export, y de ahí definir dimensiones, formato, y directorio de guardado.
Date un tiempo para practicar tus visualizaciones y usa tu conocimiento en cada proyecto relevante. Al principio todo te saldrá mal. Consulta la documentación de ayuda, los foros en internet, y los materiales de este taller. Con el tiempo, te volverás una experta y tus colegas te buscarán para que hagas las gráficas de los artículos. Cóbrales caro.