“Un simple gráfico ha brindado más información a la mente del analista de datos que cualquier otro dispositivo”. — John Tukey
En este proyecto, se desarrolla las actividades propuestas en R for Data Science de Hadley Wickham y Garrett Grolemund.
De los muchos sistemas que posee R para hacer gráficos, ggplot2 es uno de los más elegantes y versátiles. Se indaga las funciones de este paquete, examina la gramática de gráficos, y recursos disponibles para la desafiante tarea de visuliazación de datos.
ggplot(data = millas)
dim(millas)
## [1] 234 11
?millas
ggplot(data = millas) +
geom_point(mapping = aes(x =cilindros , y = autopista))
ggplot(data = millas) +
geom_point(mapping = aes(x =clase , y = traccion))
ggplot(data = millas) +
geom_point(mapping = aes(x = cilindrada, y = autopista, color = "blue"))
Para corregir:
ggplot(data = millas) +
geom_point(mapping = aes(x = cilindrada, y = autopista), colour = "blue")
str(millas)
## tibble [234 x 11] (S3: tbl_df/tbl/data.frame)
## $ fabricante : chr [1:234] "audi" "audi" "audi" "audi" ...
## $ modelo : chr [1:234] "a4" "a4" "a4" "a4" ...
## $ cilindrada : num [1:234] 1.8 1.8 2 2 2.8 2.8 3.1 1.8 1.8 2 ...
## $ anio : int [1:234] 1999 1999 2008 2008 1999 1999 2008 1999 1999 2008 ...
## $ cilindros : int [1:234] 4 4 4 4 6 6 6 4 4 4 ...
## $ transmision: chr [1:234] "auto(l5)" "manual(m5)" "manual(m6)" "auto(av)" ...
## $ traccion : chr [1:234] "d" "d" "d" "d" ...
## $ ciudad : int [1:234] 18 21 20 21 16 18 18 18 16 20 ...
## $ autopista : int [1:234] 29 29 31 30 26 26 27 26 25 28 ...
## $ combustible: chr [1:234] "p" "p" "p" "p" ...
## $ clase : chr [1:234] "compacto" "compacto" "compacto" "compacto" ...
?millas
## starting httpd help server ... done
str(millas)
## tibble [234 x 11] (S3: tbl_df/tbl/data.frame)
## $ fabricante : chr [1:234] "audi" "audi" "audi" "audi" ...
## $ modelo : chr [1:234] "a4" "a4" "a4" "a4" ...
## $ cilindrada : num [1:234] 1.8 1.8 2 2 2.8 2.8 3.1 1.8 1.8 2 ...
## $ anio : int [1:234] 1999 1999 2008 2008 1999 1999 2008 1999 1999 2008 ...
## $ cilindros : int [1:234] 4 4 4 4 6 6 6 4 4 4 ...
## $ transmision: chr [1:234] "auto(l5)" "manual(m5)" "manual(m6)" "auto(av)" ...
## $ traccion : chr [1:234] "d" "d" "d" "d" ...
## $ ciudad : int [1:234] 18 21 20 21 16 18 18 18 16 20 ...
## $ autopista : int [1:234] 29 29 31 30 26 26 27 26 25 28 ...
## $ combustible: chr [1:234] "p" "p" "p" "p" ...
## $ clase : chr [1:234] "compacto" "compacto" "compacto" "compacto" ...
ggplot(data = millas) +
geom_point(mapping = aes(x = ciudad, y = autopista, color = cilindrada ))
ggplot(data = millas) +
geom_point(mapping = aes(x = ciudad, y = autopista, size = cilindrada ))
Una variable continua no puede ser representada por shape, porque considera sólo 6 valores.
ggplot(data = millas) +
geom_point(mapping = aes(x = cilindrada, y = autopista, size = ciudad ))
ggplot(data = millas) +
geom_point(mapping = aes(x = cilindrada, y = autopista, color = ciudad))
Tampoco podemos representar con shape la variable ciudad porque los valores que toma esta variable son superiores a los que la estética shape puede considerar.
ggplot(data = millas) +
geom_point(mapping = aes(x = cilindrada, y = autopista, color = clase, shape= clase, size=clase))
ggplot(data = millas) +
geom_point(mapping = aes(x = cilindrada, y = autopista, colour = clase, shape = clase))
?geom_point
ggplot(data = millas) +
geom_point(mapping = aes(x = cilindrada, y = autopista, stroke= 1))
ggplot(data = millas) +
geom_point(mapping = aes(x = cilindrada, y = autopista, stroke= 2))
ggplot(data = millas) +
geom_point(mapping = aes(x = cilindrada, y = autopista, stroke= 3))
ggplot(data = millas) +
geom_point(mapping = aes(x = cilindrada, y = autopista, color = cilindrada < 5))
ggplot(data = millas) +
geom_point(mapping = aes(x = ciudad, y = autopista)) +
facet_wrap(~ cilindrada, nrow = 2)
ggplot(data = millas) +
geom_point(mapping = aes(x = cilindrada, y = autopista)) +
facet_wrap(~ ciudad, nrow = 2)
ggplot(data = millas) +
geom_point(mapping = aes(x = cilindrada, y = autopista)) +
facet_grid(traccion ~ cilindros)
ggplot(data = millas) +
geom_point(mapping = aes(x = traccion, y = cilindros))
ggplot(data = millas) +
geom_point(mapping = aes(x = cilindrada, y = autopista)) +
facet_grid(traccion ~ .)
ggplot(data = millas) +
geom_point(mapping = aes(x = cilindrada, y = autopista)) +
facet_grid(. ~ cilindros)
ggplot(data = millas) +
geom_point(mapping = aes(x = cilindrada, y = autopista)) +
facet_wrap(~ clase, nrow = 2)
ggplot(data = millas) +
geom_point(mapping = aes(x = cilindrada, y = autopista, color= clase))
?facet_wrap
ggplot(data = millas) +
geom_point(mapping = aes(x = cilindrada, y = autopista)) +
facet_wrap(~ clase, nrow = 2)
ggplot(data = millas) +
geom_point(mapping = aes(x = cilindrada, y = autopista)) +
facet_wrap(~ clase, nrow = 4, ncol = 2)
Otra opción que controla el diseño en los paneles, es as.table; si es VERDADERO, el valor predeterminado, las facetas se presentan como una tabla con los valores más altos en la parte inferior derecha. Si es FALSO, las facetas se presentan como un gráfico con el valor más alto en la parte superior derecha.
ggplot(data = millas) +
geom_point(mapping = aes(x = cilindrada, y = autopista)) +
facet_wrap(~ clase, as.table = F)
facet_grid() no tiene argumentos nrow y ncol porque ordena a los subgráfico dado los niveles de las variables categóricas llamadas en la función. La primera variable escrita antes de ~, sus niveles se orden por fila, mientras que la segunda variable, sus niveles se orden por columna.
ggplot(data = millas) +
geom_point(mapping = aes(x = cilindrada, y = autopista)) +
facet_grid(traccion ~ cilindros)
ggplot(data = millas) +
geom_point(mapping = aes(x = cilindrada, y = autopista)) +
facet_grid(cilindros ~ traccion)
ggplot(data = millas) +
geom_line(aes(x = cilindrada, y = autopista))
#Gráfico de líneas adecuado para x e y continuas
ggplot(data = millas) +
geom_histogram(aes(x = cilindrada))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
# Histograma para representar una variables numericas.
ggplot(data = millas) +
geom_boxplot(aes(x = traccion, y = autopista))
# Gráfico de caja para representar una variable numerica y una variable categórica.
ggplot(data = millas) +
geom_area(aes(x = cilindrada, y = ..density..), stat = "bin")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
# Puedo ver la función de densidad de una variable continua
ggplot(data = millas, mapping = aes(x = cilindrada, y = autopista, color = traccion)) +
geom_point() +
geom_smooth(se = FALSE)
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
ggplot(data = millas) +
geom_smooth(
mapping = aes(x = cilindrada, y = autopista, color = traccion),
show.legend = FALSE
)
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
ggplot(data = millas) +
geom_smooth(
mapping = aes(x = cilindrada, y = autopista, color = traccion))
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
?geom_smooth
ggplot(data = millas, mapping = aes(x = cilindrada, y = autopista)) +
geom_point() +
geom_smooth()
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
ggplot() +
geom_point(data = millas, mapping = aes(x = cilindrada, y = autopista)) +
geom_smooth(data = millas, mapping = aes(x = cilindrada, y = autopista))
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
# Primer gráfico
ggplot() +
geom_point(data = millas, mapping = aes(x = cilindrada, y = autopista)) +
geom_smooth(data = millas, mapping = aes(x = cilindrada, y = autopista), color= "blue", se=FALSE)
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
# Segundo gráfico
ggplot() +
geom_point(data = millas, mapping = aes(x = cilindrada, y = autopista)) +
geom_smooth(data = millas, mapping = aes(x = cilindrada, y = autopista, group = traccion), se = FALSE)
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
# Tercer gráfico
ggplot(data = millas, mapping = aes(x = cilindrada, y = autopista, color = traccion)) +
geom_point() +
geom_smooth(se = F)
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
# Cuarto gráfico
ggplot(data = millas) +
geom_point(mapping = aes(x = cilindrada, y = autopista, color = traccion))+
geom_smooth(mapping = aes(x = cilindrada, y = autopista), se = F)
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
# Quinto gráfico
ggplot(data = millas) +
geom_point(mapping = aes(x = cilindrada, y = autopista, color = traccion))+
geom_smooth(mapping = aes(x = cilindrada, y = autopista, linetype = traccion), se = F)
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
# Sexto gráfico
ggplot(data = millas, mapping = aes(x = cilindrada, y = autopista)) +
geom_point(size = 4, colour = "white") +
geom_point(aes(colour = traccion))
Trabajamos con el conjunto de datos diamantes. Tenemos 53 940 observaciones y 10 variables; 3 variables categóricas, corte, color, claridad, y 7 variables numericas continuas, precio, quilate, profundidad, tabla, x, y, z.
str(diamantes)
## tibble [53,940 x 10] (S3: tbl_df/tbl/data.frame)
## $ precio : int [1:53940] 326 326 327 334 335 336 336 337 337 338 ...
## $ quilate : num [1:53940] 0.23 0.21 0.23 0.29 0.31 0.24 0.24 0.26 0.22 0.23 ...
## $ corte : Ord.factor w/ 5 levels "Regular"<"Bueno"<..: 5 4 2 4 2 3 3 3 1 3 ...
## $ color : Ord.factor w/ 7 levels "D"<"E"<"F"<"G"<..: 2 2 2 6 7 7 6 5 2 5 ...
## $ claridad : Ord.factor w/ 8 levels "I1"<"SI2"<"SI1"<..: 2 3 5 4 2 6 7 3 4 5 ...
## $ profundidad: num [1:53940] 61.5 59.8 56.9 62.4 63.3 62.8 62.3 61.9 65.1 59.4 ...
## $ tabla : num [1:53940] 55 61 65 58 58 57 57 55 61 61 ...
## $ x : num [1:53940] 3.95 3.89 4.05 4.2 4.34 3.94 3.95 4.07 3.87 4 ...
## $ y : num [1:53940] 3.98 3.84 4.07 4.23 4.35 3.96 3.98 4.11 3.78 4.05 ...
## $ z : num [1:53940] 2.43 2.31 2.31 2.63 2.75 2.48 2.47 2.53 2.49 2.39 ...
?stat_bin
ggplot(data = diamantes) +
stat_summary(
mapping = aes(x = corte, y = profundidad),
fun.min = min,
fun.max = max,
fun = median
)
ggplot(data = diamantes) +
geom_pointrange(mapping = aes(x = corte, y = profundidad),
stat = "summary",
fun.min = min,
fun.max = max,
fun = median
)
?geom_col
Ambos, geom_bar() y geom_col() realizan gráficos de barras. geom_bar() hace que la altura de la barra sea proporcional al número de casos en cada grupo. geom_col() hace que la altura de las barras representen valores en los datos, usa_identity(), emplea los datos como estan. Mientras que, geom_bar() usa stat_count() por defecto, es decir cuenta el número de casos en cada posición, por lo que la altura de las barras es proporcional al número de casos.
ggplot(data = diamantes) +
geom_bar(mapping = aes(x = corte, y = stat(prop),group = 1))
ggplot(data = diamantes) +
geom_bar(mapping = aes(x = corte, y = stat(prop)))
ggplot(data = diamantes) +
geom_bar(mapping = aes(x = corte, y = ..prop.., group = 1))
ggplot(data = diamantes) +
geom_bar(mapping = aes(x = corte, y = ..prop..))
ggplot(data = diamantes) +
geom_bar(mapping = aes(x = corte, y = after_stat(prop)))
ggplot(data = diamantes) +
geom_bar(mapping = aes(x = corte, y = after_stat(prop), group = 1))
No ocurre igual con el argumento fill. Stat cuando una expresión estética que utiliza variables de los datos de la capa y after_stat utiliza variables calculadas por stat. Si usamos el argumento fill debe tomar la variable calculada o realizarse el calculo en el código.
ggplot(data = diamantes) +
geom_bar(mapping = aes(x = corte, fill = corte, y = after_stat(prop)))
ggplot(data = diamantes) +
geom_bar(aes(x = corte, y = ..count.. / sum(..count..), fill = color))
ggplot(data = millas, mapping = aes(x = ciudad, y = autopista)) +
geom_point()
ggplot(data = millas) +
geom_point(mapping = aes(x = ciudad, y = autopista), position = "jitter")
ggplot(data = millas, mapping = aes(x = ciudad, y = autopista)) +
geom_jitter()
?geom_jitter
En la documentación de geom_jitter(), podemos ver los argumentos width y height controlan la dispersión en dirección positiva y negativa, a lo andho y largo, respectivamente. Por lo que la dispersión total es el doble del valor especificado en el argumento. Los valores predeterminados son de 0.4 para ambos argumentos, es decir logran una dispersión total del 0.8 a lo ancho y largo. Supongamos que sólo queremos una dispersión horizontal y al revés.
ggplot(data = millas, mapping = aes(x = ciudad, y = autopista)) +
geom_jitter(width = 0)
ggplot(data = millas, mapping = aes(x = ciudad, y = autopista)) +
geom_jitter(height = 0)
?geom_count
ggplot(data = millas, mapping = aes(x = ciudad, y = autopista)) +
geom_jitter()
ggplot(data = millas, mapping = aes(x = ciudad, y = autopista)) +
geom_count()
La posición predeterminada en geom_boxplot es dodge2, que conserva la posición vertical de un geom mientras ajusta la posición horizontal para evitar la superposición. Si agregamos colour = clase a un diagrama de cajas, los niveles de transmision se ubican lado a lado.
?position_dodge2()
ggplot(data = millas, aes(x = traccion, y = cilindrada, colour = clase)) +
geom_boxplot()
ggplot(data = diamantes) +
geom_bar(mapping = aes(x = corte, fill = claridad))
bar <- ggplot(data = diamantes) +
geom_bar(
mapping = aes(x = corte , fill = claridad),
show.legend = FALSE,
width = 1
) +
theme(aspect.ratio = 1) +
labs(x = NULL, y = NULL)
bar + coord_flip()
bar + coord_polar()
?labs()
bar <- ggplot(data = diamantes) +
geom_bar(
mapping = aes(x = corte , fill = claridad),
show.legend = T,
width = 1
) +
theme(aspect.ratio = 1) +
labs(x = "Corte", y = "Frecuencia", title = "Diamantes por tipo de corte y claridad")
bar + coord_flip()
bar + coord_polar()
?coord_quickmap
coord_map() realiza una proyección cartográfica de la Tierra, que es aproximadamente esférica, en un plano plano 2D utilizando cualquier proyección definida por el paquete mapproj. Las proyecciones de mapas, en general, no conservan las líneas rectas, por lo que esto requiere un cálculo considerable.
coord_quickmap() es una aproximación rápida que conserva las líneas rectas. Funciona mejor para áreas más pequeñas cerca del ecuador.
ggplot(data = millas, mapping = aes(x = ciudad, y = autopista)) +
geom_point() +
geom_abline() +
coord_fixed()