::p_load(rio, dplyr, ggplot2) pacman
Clase práctica Semana 11
Descarga la carpeta .zip para acceder al material de esta sesión. Haga click en el siguiente enlace. No olvides unzipear el archivo.
Gráficar en R
Usaremos el paquete ggplot 2 para generar distintos tipos de gráficos: - Gráfico de barras - Histograma - Boxplot
Primero, preparamos todos los insumos que necesitaremos y ya conocemos (carga de paquetes, importación de data y tabulación de resultados)
Cargar paquetes
Importación de data
<- import("data/filmaffinity_dataset_limpio.xlsx") df
Exploración de data
str(df)
'data.frame': 119003 obs. of 9 variables:
$ index : num 0 1 2 3 4 5 6 7 8 9 ...
$ Título : chr "'49-'17" "10,000 Years B.C. (C)" "1812" "20.000 leguas de viaje submarino (C)" ...
$ Año : num 1917 1916 1912 1907 1909 ...
$ País : chr "Estados Unidos" "Estados Unidos" "Rusia" "Francia" ...
$ Dirección : chr "Ruth Ann Baldwin" "Willis H. O'Brien" "Vasili Goncharov, Kai Hansen, Aleksandr Uralsky" "Georges Méliès" ...
$ Reparto : chr "Joseph W. Girard, Leo Pierson, William Dyer, Mattie Witting, George C. Pearce, Jean Hersholt, Donna Drew" NA "Pavel Knorr, Vasili Goncharov, Aleksandra Goncharova, Andrej Gromov, V. Serjozhinikov, A. Veskov" "Georges Méliès" ...
$ Nota : num NA 5.1 NA 6 5.3 NA 5.4 NA 4.6 NA ...
$ Tipo filme: chr "Película" "Cortometraje" "Película" "Cortometraje" ...
$ Género : chr "Western" "Comedia" "Drama" "Fantástico" ...
Gráfico de barras
¿Qué variable podemos representar con un gráfico de barras?
Antes de graficar, vamos a crear una tabla de frecuencias y porcentajes usando count
y mutate
, como ya hemos aprendido. Esta tabla se usará como base para construir los gráficos con el paquete {ggplot2}
.
Este paquete funciona por capas: cada capa agrega elementos o configuraciones al gráfico. Empezaremos con una estructura básica para generar gráficos de barras, uniendo las capas con el símbolo +
.
<- df %>%
tab_bars count(`Tipo filme`) %>%
mutate(pct = n / sum(n) * 100)
ggplot(tab_bars, aes(x = `Tipo filme`, y = pct)) +
geom_col()
- 1
-
En la función
ggplot
existe el argumentodata
donde ingresamos nuestro objetotab_bars
. Los elementos que deseamos graficar van en la funciónaes
. - 2
-
Indicamos el tipo de gráfico con
geom_col()
.
Probemos añadir más capas para personalizar el gráfico y hacerlo más visualmente claro y llamativo
ggplot(tab_bars, aes(x = `Tipo filme`, y = pct)) +
geom_col(fill = "steelblue") +
labs(title = "Gráfico 1: Tipo de filme (%)",
x = "Tipo de filme",
y = "Porcentaje") +
theme_minimal()
- 1
-
Dentro de la función
ggplot
, ingresamos en el argumentodata
nuestro objetotab_bars
. Los elementos que deseamos graficar van en la funciónaes
. - 2
-
Indicamos el tipo de gráfico con
geom_col()
. Agregamos el argumentofill
para indicar el color que rellenará las barras. - 3
-
Con
labs
(abreviatura de labels), indicamos etiquetas para el título y ejes x e y. - 4
-
theme_minimal
nos da una visualización más limpia quitando el fondo gris.
La versatilidad de {ggplot2}
nos permite personalizar distintas combinaciones.
ggplot(tab_bars, aes(x = `Tipo filme`, y = pct, fill = `Tipo filme`)) +
geom_col() +
labs(title = "Gráfico 1: Tipo de filme (%)",
x = "Tipo de filme",
y = "Porcentaje") +
coord_flip() +
theme_minimal() +
scale_fill_brewer(palette = "Set3")
- 1
-
Dentro de la función
ggplot
, ingresamos en el argumentodata
nuestro objetotab_bars
. Los elementos que deseamos graficar van en la funciónaes
. - 2
-
Indicamos el tipo de gráfico con
geom_col()
. - 3
-
Con
labs
(abreviatura de labels), indicamos etiquetas para el título y ejes x e y. - 4
-
coord_flip
gira los ejes para darnos barras horizontales. - 5
-
theme_minimal
nos da una visualización más limpia quitando el fondo gris. - 6
-
En
scale_fill_brewer
indicamos una paleta de colores para usar.
También podemos cruzar variables.
<- df %>%
df2 mutate(Nota_cat =
case_when(Nota < 5 ~ "Menos de 5",
>= 5 ~ "5 a más",
Nota is.na(Nota) ~ "Sin nota"),
Nota_cat =
factor(Nota_cat,
levels = c("Sin nota", "5 a más", "Menos de 5"),
ordered = TRUE))
<- df2 %>%
tab_bars2 group_by(`Tipo filme`) %>%
count(Nota_cat) %>%
mutate(pct = round(n / sum(n) * 100, 0))
ggplot(tab_bars2, aes(x = `Tipo filme`, y = pct, fill = Nota_cat)) +
geom_col() +
labs(title = "Gráfico 1: Tipo de filme (%)",
x = "Tipo de filme",
y = "Porcentaje") +
geom_text(aes(label = pct), position = position_stack(vjust = 0.5)) +
theme_minimal() +
scale_fill_brewer(palette = "Set3")
- 1
-
Creamos una variable categórica a partir de
Nota
conmutate
ycase_when
. - 2
-
Volvemos nuestra variable
Nota_cat
un factor ordenado para ordenar las categorías. - 3
-
Creamos nuestra tabla y añadimos la función
group_by
para calcular las frecuencias deNota_cat
dentro de cada tipo de filme. - 4
-
Dentro de la función
ggplot
, ingresamos en el argumentodata
nuestro objetotab_bars2
. Los elementos que deseamos graficar van en la funciónaes
. Añadimos enaes
el argumentofill
para colorear individualmente cada categoría deNota_cat
. - 5
-
Indicamos el tipo de gráfico con
geom_col()
. - 6
-
Con
labs
(abreviatura de labels), indicamos etiquetas para el título y ejes x e y. - 7
-
geom_text
sirve para colocar las etiquetas de los valores. - 8
-
theme_minimal
nos da una visualización más limpia quitando el fondo gris. - 9
-
En
scale_fill_brewer
indicamos una paleta de colores para usar.
Histograma
¿Qué variable podemos representar con un histograma?
ggplot(df, aes(x = Año)) +
geom_histogram(fill = "steelblue") +
labs(title = "Gráfico 2: Año de estreño de filmes",
x = "Año",
y = "Frecuencia") +
theme_minimal()
- 1
-
Dentro de la función
ggplot
, ingresamos en el argumentodata
nuestro objetodf
y los elementos que deseamos graficar en la funciónaes
(solamente usamos el argumentox
en este caso). - 2
-
Indicamos el tipo de gráfico con
geom_histogram()
. Agregamos el argumentofill
para indicar el color que rellenará las barras. - 3
-
Con
labs
(abreviatura de labels), indicamos etiquetas para el título y ejes x e y. - 4
-
theme_minimal
nos da una visualización más limpia quitando el fondo gris.
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Una capa que nos permite cruzar la información para una visualización desagregada es facet_wrap
.
ggplot(df, aes(x = Año)) +
geom_histogram(fill = "steelblue") +
facet_wrap(~ `Tipo filme`, scales = "free") +
labs(title = "Gráfico 2: Año de estreño de filmes",
x = "Año",
y = "Cantidad") +
theme_minimal()
- 1
-
Dentro de la función
ggplot
, ingresamos en el argumentodata
nuestro objetodf
y los elementos que deseamos graficar en la funciónaes
(solamente usamos el argumentox
en este caso). - 2
-
Indicamos el tipo de gráfico con
geom_histogram()
. Agregamos el argumentofill
para indicar el color que rellenará las barras. - 3
-
Esta función divide en facetas por grupo. Colocamos la variable de grupos después del símbolo
~
. - 4
-
Con
labs
(abreviatura de labels), indicamos etiquetas para el título y ejes x e y. - 5
-
theme_minimal
nos da una visualización más limpia quitando el fondo gris.
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Box Plot
¿Qué variable podemos representar con un box plot?
ggplot(df, aes(y = Nota, x = `Tipo filme`, fill = `Tipo filme`)) +
geom_boxplot(show.legend = F) +
scale_fill_brewer(palette = "Set3")
- 1
-
Dentro de la función
ggplot
, ingresamos en el argumentodata
nuestro objetodf
. Los elementos que deseamos graficar van en la funciónaes
. - 2
-
Indicamos el tipo de gráfico con
geom_boxplot()
. Ocultamos la leyenda conF
en el argumentoshow.legend
. - 3
-
En
scale_fill_brewer
indicamos una paleta de colores para usar.
Exportación de gráficos
Finalmente, para exportar gráficos, se puede utilizar la siguiente función también en {ggplot2}
:
<- ggplot(df, aes(y = Nota, x = `Tipo filme`)) +
plot geom_boxplot()
ggsave("outputs/boxplot.png", plot)
- 1
-
Asignamos el gráfico al objeto
plot
. - 2
- Exportamos el plot.
Saving 7 x 5 in image
Ejercicio final
Responde las siguientes preguntas a partir de gráficos generados con {ggplot2}
:
- ¿Cómo ha evolucionado la producción de filmes franceses a lo largo del tiempo? ¿Existen diferncias según tipo de filme? Representa visualmente la información y comenta la tendencia observada.
- ¿Cómo ha evolucionado la producción de filmes peruanos a lo largo del tiempo? ¿Existen diferncias según tipo de filme? Representa visualmente la información y comenta la tendencia observada.