Paul E. Santos Andrade | Data viz| 2021-01-21
{ggplot2} es un sistema para crear gráficos de forma declarativa, basado en "The Grammar of Graphics" (Wilkinson, 2005).
Tú proporcionas los datos, le dices a {ggplot2} cómo asignar variables, qué fuentes gráficas usar y él se encarga de los detalles.
ggplot2 es un paquete de visualización de datos desarrollado en el lenguaje de programación R, creado por Hadley Wickham en 2005.
install.packages("ggplot2")library(ggplot2)
{ggplot2} es parte de {tidyverse}, un conjunto de paquetes que funcionan en armonía para manipular y explorar datos.
install.packages("tidyverse")library(tidyverse)
tidiverse esta formado por dplyr, tidyr, ggplot2, readr, tibble, purrr...
Datos del Estudio Nacional de Contaminación del Aire de Morbilidad y Mortalidad (NMMAPS), filtrado para la ciudad de Chicago y el intervalo de tiempo de enero de 1997 a diciembre de 2000.
chic <- readr::read_csv(here("data", "chicago-nmmaps.csv")) %>% mutate(season = factor(season, levels = c("Spring", "Summer", "Autumn", "Winter")), year = factor(year, levels = as.character(1997:2000)))chic %>% glimpse()
## Rows: 1,461## Columns: 10## $ city <chr> "chic", "chic", "chic", "chic", "chic", "chic", "chic", "c...## $ date <date> 1997-01-01, 1997-01-02, 1997-01-03, 1997-01-04, 1997-01-0...## $ death <dbl> 137, 123, 127, 146, 102, 127, 116, 118, 148, 121, 110, 127...## $ temp <dbl> 36.0, 45.0, 40.0, 51.5, 27.0, 17.0, 16.0, 19.0, 26.0, 16.0...## $ dewpoint <dbl> 37.500, 47.250, 38.000, 45.500, 11.250, 5.750, 7.000, 17.7...## $ pm10 <dbl> 13.052268, 41.948600, 27.041751, 25.072573, 15.343121, 9.3...## $ o3 <dbl> 5.659256, 5.525417, 6.288548, 7.537758, 20.760798, 14.9408...## $ time <dbl> 3654, 3655, 3656, 3657, 3658, 3659, 3660, 3661, 3662, 3663...## $ season <fct> Winter, Winter, Winter, Winter, Winter, Winter, Winter, Wi...## $ year <fct> 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997...
"The Grammar of Graphics"
Datos data -> Los datos que desea visualizar.
Estética aes() -> como se asignan las variables de los datos a los atributos estéticos.
Capas geom_ooo y stat_ooo -> Las formas geométricas y los resúmenes estadísticos como se representarán los datos.
Escalas scale_ooo -> como visualizar los datos en las dimensiones estéticas.
Sistema de coordenadas coord_ooo -> sistema de coordenadas, describe cómo se asignan las coordenadas de datos al plano del gráfico.
Facetas facet_ooo -> La disposición de los datos en una cuadrícula de gráficos.
Temas visuales theme() y theme_ooo -> Los valores predeterminados visuales generales de un grafico.
ggplot(data, aes(x, y))
Necesitamos especificar los datos y las dos variables que queremos visualizar en la función ggplot():
ggplot( data = chic, mapping = aes( date, temp ))
Solo hay un panel vacío porque {ggplot2} no sabe cómo debería trazar los datos.
Necesitamos especificar los datos y las dos variables que queremos visualizar en la función ggplot():
Dado que casi todos los ggplot() toman lo mismo argumentos (data, mapeo = aes (x, y)), también podemos escribir:
ggplot( chic, aes( date, temp ))
Necesitamos especificar los datos y las dos variables que queremos visualizar en la función ggplot():
Dado que casi todos los ggplot() toman lo mismo argumentos (data, mapeo = aes (x, y)), también podemos escribir:
ggplot( chic, aes( date, temp ))
... o agrega las variables en la función aes()estética fuera de la función de ggplot()
ggplot(chic) + aes(date, temp)
Estética de los objetos geométricos y estadísticos, como:
posición a través de x, y, xmin, xmax, ymin, ymax, ...
colores mediante color y fill
transparencia vía alfa
tamaños a través de size y width
formas a través de shape y linetype
En general, todo lo que se asigna a los datos debe estar envuelto en aes() mientras que los argumentos estáticos se colocan fuera de aes().
geom_
- stat_
geom_
- stat_
Al agregar una o varias capas, podemos decirle a {ggplot2} cómo representar los datos. Hay muchos formas geométricas incorporadas (geom_
) y transformaciones estadísticas (stat_
):
Diagrama de dispersión. numérico - numérico
ggplot(chic, aes( date, temp ) ) + geom_point()
o
chic %>% ggplot(aes( date, temp ) ) + geom_point()
Diagrama de dispersión. numérico - numérico
aes(color = var
)
ggplot(chic, aes( date, temp ) ) + geom_point(aes( color = season ) )
Diagrama de dispersión. numérico - numérico
aes(shape = var
)
ggplot(chic, aes( date, temp ) ) + geom_point(aes( shape = season ) )
Formas disponibles para gráficos de dispersión:
Diagrama de dispersión. numérico - numérico
geom_point(shape = 21
)
ggplot(chic, aes( date, temp ) ) + geom_point( shape = 21 )
Gráfico lineal. numérico - numérico | categorico - numérico
ggplot(chic, aes( date, temp ) ) + geom_line()
o
chic %>% ggplot(aes( date, temp ) ) + geom_line()
Gráfico lineal. numérico - numérico | categorico - numérico
aes(color = var
)
ggplot(chic, aes( date, temp ) ) + geom_line(aes( color = year ))
Tipos de líneas:
Gráfico lineal. numérico - numérico | categorico - numérico
geom_line(linetype = "dotted"
)
ggplot(chic, aes( date, temp ) ) + geom_line( linetype = "dotted" )
Densidad – distribución. numérico
ggplot(chic, aes( o3 ) ) + geom_density()
Densidad – distribución. numérico
aes(color = var
)
ggplot(chic, aes( o3 ) ) + geom_density(aes(color = season))
Densidad – distribución. numérico
aes(fill = var
)
ggplot(chic, aes( o3 ) ) + geom_density(aes(fill = season))
Densidad – distribución. numérico
geom_density(aes(fill = var
), alpha = .2)
ggplot(chic, aes( o3 ) ) + geom_density(aes(fill = season), alpha = .2)
Histograma. numérico
ggplot(chic, aes( o3 ) ) + geom_histogram()
Histograma. numérico
geom_histogram(aes(fill = var
)
geom_histogram(aes(color = var
)
geom_histogram(alpha = .1
)
ggplot(chic, aes( o3 ) ) + geom_histogram(aes( fill = season ))
Histograma. numérico
geom_histogram(bins = 40
)
bins
, Determina el numero de columnas que se desea mostrar.
ggplot(chic, aes( o3 ) ) + geom_histogram(bins = 40)
Histograma. numérico
geom_histogram(binwidth = 20
)
binwidth
, Determina el rango de los intervalos para construir cada una de las columnas.
ggplot(chic, aes( o3 ) ) + geom_histogram(binwidth = 20)
Gráfico de barras. numérico | categórico
ggplot(chic, aes( death ) ) + geom_bar()
Gráfico de barras. categórico - numérico
chic %>% count(death, name = "count") %>% head()
## # A tibble: 6 x 2## death count## <dbl> <int>## 1 69 1## 2 73 1## 3 77 1## 4 79 1## 5 80 3## 6 81 6
chic %>% count(death, name = "count") %>% ggplot(aes(death, count)) + geom_col()
Gráfico de barras. categórico - numérico
geom_col(aes(fill = var
)
geom_col(aes(color = var
)
geom_col(alpha = .1
)
chic %>% count(season, death, name = "count") %>% head(n = 3)
## # A tibble: 3 x 3## season death count## <fct> <dbl> <int>## 1 Spring 80 1## 2 Spring 83 1## 3 Spring 84 3
chic %>% count(season, death, name = "count") %>% ggplot(aes(death, count)) + geom_col(aes(color = season))
Gráfico de cajas – gráfico de bigotes. categórico - numérico
ggplot(chic, aes( date, temp ) ) + geom_boxplot()
o
chic %>% ggplot(aes( date, temp ) ) + geom_boxplot()
Gráfico de cajas – gráfico de bigotes. categórico - numérico
ggplot(chic, aes( year, temp ) ) + geom_boxplot()
o
chic %>% ggplot(aes( year, temp ) ) + geom_boxplot()
Gráfico de cajas – gráfico de bigotes. categórico - numérico
geom_col(aes(fill = var
)
geom_col(aes(color = var
)
geom_col(alpha = .1
)
ggplot(chic, aes( year, temp ) ) + geom_boxplot(aes(color = year))
Gráfico de cajas – gráfico de bigotes. categórico - numérico
geom_col(aes(fill = var
)
geom_col(aes(color = var
)
geom_col(alpha = .1
)
ggplot(chic, aes( year, temp ) ) + geom_boxplot(aes(color = season))
chic %>% ggplot(aes( date, temp ) ) + geom_line() + geom_point() + geom_rug(sides = "l")
chic %>% ggplot(aes( date, temp ) ) + geom_point() + geom_smooth()
chic %>% ggplot(aes( date, temp ) ) + geom_point() + geom_smooth(method = "lm")
chic %>% ggplot(aes( date, temp ) ) + geom_point(aes(color = year)) + geom_smooth()
scales_
Se puede usar scale_*() para cambiar las propiedades de todas las dimensiones estéticas asignadas a los datos.
En consecuencia, existen variantes de scale_*() para todas las estéticas como:
posición a través de scale_x_ooo() y scale_y_ooo()
colores a través de scale_color_ooo() y scale_fill_ooo()
transparencia a través de scale_alpha_ooo()
tamaños a través de scale_size_ooo()
formas a través de scale_shape_ooo() y scale_linetype_ooo()
Se puede usar scale_ooo() para cambiar las propiedades de todas las dimensiones estéticas asignadas a los datos. En consecuencia, existen variantes de scale_ooo() para todas las estéticas como:
posición a través de scale_x_ooo() y scale_y_ooo()
colores a través de scale_color_ooo() y scale_fill_ooo()
transparencia a través de scale_alpha_ooo()
tamaños a través de scale_size_ooo()
formas a través de scale_shape_ooo() y scale_linetype_ooo()
... con extensiones (ooo) como:
Por ejemplo, para cambiar los títulos de los ejes:
chic %>% ggplot(aes( date, temp, color = season )) + geom_point() + scale_x_date( name = NULL) + scale_y_continuous( name = "Temperature (°F)")
Por ejemplo, para cambiar los títulos de los ejes:
chic %>% ggplot(aes( date, temp, color = season )) + geom_point() + scale_x_date(name = NULL, limits = c(as.Date("1997-01-01"), as.Date("1998-12-31"))) + scale_y_continuous( name = "Temperature (°F)")
Por ejemplo, para cambiar los títulos de los ejes:
chic %>% ggplot(aes( date, temp, color = season )) + geom_point() + scale_x_date(name = NULL, limits = c(as.Date("1997-01-01"), as.Date("1998-12-31"))) + scale_y_continuous(name = "Temperature (°F)", breaks = seq(0, 90, 20))
Por ejemplo, para cambiar los títulos de los ejes:
ggplot(chic, aes(date, temp)) + geom_point(aes(color = season)) + scale_y_continuous( name = NULL, breaks = c(0, 30, 60, 90), labels = c( '"Muy, frio!!!"', '"Frio"', '"Ideal"', '"Muy caliente!!!"' ) )
Del mismo modo, podemos cambiar las propiedades de las otras características. por ejemplo, modificar los colores predeterminados:
ggplot(chic, aes(date, temp)) + geom_point(aes(color = season)) + scale_color_manual( values = c( "red", "green", "blue", "yellow" ))
Renombrar la leyenda:
ggplot(chic, aes(date, temp)) + geom_point(aes(color = season)) + scale_color_manual( values = c( "red", "green", "blue", "yellow" ), name = "Temporada:")
Renombrar la leyenda:
ggplot(chic, aes(date, temp)) + geom_point(aes(color = season)) + scale_color_manual( values = c( "red", "green", "blue", "yellow" ), name = "Temporada:", guide = FALSE)
coord_
Los sistemas de coordenadas combinan dos elementos que determinan la disposición de las características (generalmente x – y) para producir una posición “x, y” en el gráfico.
Sistemas de coordenadas lineales que conservan la forma de las geoms:
Sistemas de coordenadas no lineales que probablemente cambian las formas:
ggplot(chic, aes(date, temp)) + geom_line() + coord_cartesian( ylim = c(50, 70) )
ggplot(chic, aes(year, temp)) + geom_boxplot() + coord_cartesian( ylim = c(50, 70) )
ggplot(chic, aes(year, temp)) + geom_boxplot() + scale_y_continuous( limits = c(50, 70) )
ggplot(chic, aes(season, temp)) + geom_col()
ggplot(chic, aes(season, temp)) + geom_col() + coord_flip()
ggplot(chic, aes(season, temp)) + geom_col()
ggplot(chic, aes(season, temp)) + geom_col() + coord_polar()
facet_
facet_wrap() divide la imagen en múltiples paneles con base en una variable de agrupación:
ggplot(chic, aes(temp, o3)) + geom_point(aes(color = year)) +facet_wrap(~season)
facet_grid() genera una cuadricula en base a la combinación de dos variables de agrupación:
ggplot(chic, aes(temp, o3)) + geom_point(aes(color = year)) +facet_grid(year ~ season)
facet_grid() genera una cuadricula en base a la combinación de dos variables de agrupación:
ggplot(chic, aes(temp, o3)) + geom_point(aes(color = year)) +facet_grid(.~ season)
facet_grid() genera una cuadricula en base a la combinación de dos variables de agrupación:
ggplot(chic, aes(temp, o3)) + geom_point(aes(color = year)) +facet_grid(year ~.)
theme()
- theme_
theme() - theme_ controlan la visualización de todos los elementos de la grafico que no son datos
a. títulos
b. etiquetas
c. fuentes
d. fondo
e. líneas de cuadrícula
f. leyendas
ggplot(chic, aes(date, temp)) + geom_point() +theme(axis.text = element_text(size = 15,face = "bold",color = "red"),panel.grid.major.x = element_line(linetype = "dotted",color = "black"),plot.background = element_rect(fill = "dodgerblue",color = "goldenrod" ) )
ggplot(chic, aes(date, temp)) + geom_point() +theme_minimal() +theme(axis.title.x = element_blank(),panel.grid.major.y = element_blank(),panel.grid.minor = element_blank() )
ggplot(chic, aes(date, temp)) + geom_point() +theme_gray()
ggplot(chic, aes(date, temp)) + geom_point() +theme_minimal()
ggplot2: Elegant Graphics for Data Analysis https://ggplot2-book.org/index.html
Data Visualization: A Practical Introduction Kieran Healy socviz
Fundamentals of Data Visualization Claus Wilke https://clauswilke.com/dataviz/
R Graphics Cookbook Winston Chang https://r-graphics.org/
R for Data Science Hadley Wickham - Garrett Grolemund r4ds - r4ds-es
Statistical Inference via Data Science A ModernDive into R and the Tidyverse Chester Ismay - Albert Y. Kim ModernDive
...
install.packages('patchwork')library(patchwork)panel_a <- chic %>% ggplot(aes(date, temp, color = year)) + geom_point()+ theme_minimal() + theme(legend.position = "bottom")panel_b <- chic %>% ggplot(aes(year, o3)) + geom_boxplot() + theme_minimal() # panel_a + panel_b
install.packages('cowplot')library(cowplot)panel_a <- chic %>% ggplot(aes(date, temp, color = year)) + geom_point()+ theme_minimal() + theme(legend.position = "bottom")panel_b <- chic %>% ggplot(aes(year, o3)) + geom_boxplot() + theme_minimal() # cowplot::plot_grid(panel_a, panel_b, ncol = 1)
chic %>% group_by(year, season) %>% summarise(mean = mean(temp)) %>% ggplot(aes(year, mean)) + geom_point(aes(color = season))+ geom_text(aes(label = season, color = season)) + theme_minimal() + theme(legend.position = "none")
# install.packages('ggrepel')library(ggrepel)chic %>% group_by(year, season) %>% summarise(mean = mean(temp)) %>% ggplot(aes(year, mean)) + geom_point(aes(color = season))+ geom_text_repel(aes(label = season, color = season)) + theme_minimal() + theme(legend.position = "none")
install.packages("ggalt")library(ggalt)chic %>% group_by(year) %>% summarise(mean_tem = mean(temp), min_temp = min(temp), max_temp = max(temp)) %>% ggplot(aes(y = year, x = min_temp, xend = max_temp)) + geom_dumbbell(size = 3, color = "#e3e2e1", colour_x = "#5b8124", colour_xend = "#bad744", dot_guide = TRUE, dot_guide_size = .25) + theme(axis.title = element_blank())
install.packages("ggtext")library(ggtext)labels <- c( setosa = "<img src='img/setosa.jpg' width='100' height='50' /><br>*I. setosa*", virginica = "<img src='img/virginica.jpg' width='100' /><br>*I. virginica*", versicolor = "<img src='img/versicolor.jpg' width='100' /><br>*I. versicolor*")ggplot(iris, aes(Species, Sepal.Width)) + geom_boxplot() + scale_x_discrete( name = NULL, labels = labels ) + theme_minimal() + theme( axis.text.x = element_markdown(color = "black", size = 11) )
{ggplot2} es un sistema para crear gráficos de forma declarativa, basado en "The Grammar of Graphics" (Wilkinson, 2005).
Tú proporcionas los datos, le dices a {ggplot2} cómo asignar variables, qué fuentes gráficas usar y él se encarga de los detalles.
Keyboard shortcuts
↑, ←, Pg Up, k | Go to previous slide |
↓, →, Pg Dn, Space, j | Go to next slide |
Home | Go to first slide |
End | Go to last slide |
Number + Return | Go to specific slide |
b / m / f | Toggle blackout / mirrored / fullscreen mode |
c | Clone slideshow |
p | Toggle presenter mode |
t | Restart the presentation timer |
?, h | Toggle this help |
Esc | Back to slideshow |