+ - 0:00:00
Notes for current slide
Notes for next slide

{ggplot2}

ggplot2

Visualización de datos

Paul E. Santos Andrade | Data viz| 2021-01-21

1 / 82

{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.

Descripción ggplot2

2 / 82

Ventajas de ggplot2

  • Gramática subyacente consistente (Wilkinson, 2005)
  • Especificación de capas muy flexible
  • Sistema de herramientas para pulir la apariencia
  • Comunidad activa y útil (Twitter, R4DS Learning Community)
3 / 82

by: Cédric Scherer

4 / 82

by: Cédric Scherer

5 / 82

by: Cédric Scherer

6 / 82

by: Cédric Scherer

7 / 82

by: Martin Devaux

8 / 82

Libreria

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...

9 / 82

Datos

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...
10 / 82

La estructura de ggplot2

"The Grammar of Graphics"

11 / 82

La estructura de ggplot2

  1. Datos data -> Los datos que desea visualizar.

  2. Estética aes() -> como se asignan las variables de los datos a los atributos estéticos.

  3. Capas geom_ooo y stat_ooo -> Las formas geométricas y los resúmenes estadísticos como se representarán los datos.

  4. Escalas scale_ooo -> como visualizar los datos en las dimensiones estéticas.

  5. Sistema de coordenadas coord_ooo -> sistema de coordenadas, describe cómo se asignan las coordenadas de datos al plano del gráfico.

  6. Facetas facet_ooo -> La disposición de los datos en una cuadrícula de gráficos.

  7. Temas visuales theme() y theme_ooo -> Los valores predeterminados visuales generales de un grafico.

12 / 82

Data

ggplot(data, aes(x, y))

13 / 82

1. Data ggplot()

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.

14 / 82

1. Data ggplot()

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
)
)

15 / 82

1. Data ggplot()

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)

16 / 82

Estética

aes()

17 / 82

2. Estética aes()

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().

18 / 82

Capas - Layers

geom_ - stat_

19 / 82

3. Capas 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_):

20 / 82

3. Capas: geom_point()

Diagrama de dispersión. numérico - numérico

ggplot(chic,
aes(
date,
temp
)
) +
geom_point()

o

chic %>%
ggplot(aes(
date,
temp
)
) +
geom_point()

21 / 82

3. Capas: geom_point()

Diagrama de dispersión. numérico - numérico

aes(color = var)

ggplot(chic,
aes(
date,
temp
)
) +
geom_point(aes(
color = season
)
)

22 / 82

3. Capas: geom_point()

Diagrama de dispersión. numérico - numérico

aes(shape = var)

ggplot(chic,
aes(
date,
temp
)
) +
geom_point(aes(
shape = season
)
)

23 / 82

3. Capas: geom_point()

Formas disponibles para gráficos de dispersión:

24 / 82

3. Capas: geom_point()

Diagrama de dispersión. numérico - numérico

geom_point(shape = 21)

ggplot(chic,
aes(
date,
temp
)
) +
geom_point(
shape = 21
)

25 / 82

3. Capas: geom_line()

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()

26 / 82

3. Capas: 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
))

27 / 82

3. Capas: geom_line()

Tipos de líneas:

28 / 82

3. Capas: geom_line()

Gráfico lineal. numérico - numérico | categorico - numérico

geom_line(linetype = "dotted")

ggplot(chic,
aes(
date,
temp
)
) +
geom_line(
linetype = "dotted"
)

29 / 82

3. Capas: geom_density()

Densidad – distribución. numérico

ggplot(chic,
aes(
o3
)
) +
geom_density()

30 / 82

3. Capas: geom_density()

Densidad – distribución. numérico

aes(color = var)

ggplot(chic,
aes(
o3
)
) +
geom_density(aes(color = season))

31 / 82

3. Capas: geom_density()

Densidad – distribución. numérico

aes(fill = var)

ggplot(chic,
aes(
o3
)
) +
geom_density(aes(fill = season))

32 / 82

3. Capas: geom_density()

Densidad – distribución. numérico

geom_density(aes(fill = var), alpha = .2)

ggplot(chic,
aes(
o3
)
) +
geom_density(aes(fill = season),
alpha = .2)

33 / 82

3. Capas: geom_histogram()

Histograma. numérico

ggplot(chic,
aes(
o3
)
) +
geom_histogram()

34 / 82

3. Capas: 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
))

35 / 82

3. Capas: geom_histogram()

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)

36 / 82

3. Capas: geom_histogram()

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)

37 / 82

3. Capas: geom_bar()

Gráfico de barras. numérico | categórico

ggplot(chic,
aes(
death
)
) +
geom_bar()

38 / 82

3. Capas: geom_col()

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()

39 / 82

3. Capas: 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))

40 / 82

3. Capas: geom_boxplot()

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()

41 / 82

3. Capas: 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()

42 / 82

3. Capas: 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))

43 / 82

3. Capas: 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 = season))

44 / 82

3. Capas: Múltiples capas

chic %>%
ggplot(aes(
date,
temp
)
) +
geom_line() +
geom_point() +
geom_rug(sides = "l")

45 / 82

3. Capas: Múltiples capas

chic %>%
ggplot(aes(
date,
temp
)
) +
geom_point() +
geom_smooth()

46 / 82

3. Capas: Múltiples capas

chic %>%
ggplot(aes(
date,
temp
)
) +
geom_point() +
geom_smooth(method = "lm")

47 / 82

3. Capas: Múltiples capas

chic %>%
ggplot(aes(
date,
temp
)
) +
geom_point(aes(color = year)) +
geom_smooth()

48 / 82

Escalas

scales_

49 / 82

4. Escalas scale_

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()

50 / 82

4. Escalas scale_

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:

  • continuous(), discrete(), reverse(), log10(), squrt(), date(), time() ejes.
  • continuous(), discrete(), manual(), gradient(), hue(), brewer() for colores (bordes - contenido).
  • continuous(), discrete(), manual(), ordinal(), identity(), date() transparencias.
  • continuous(), discrete(), manual(), ordinal(), identity(), area(), date() tamaños.
  • continuous(), discrete(), manual(), ordinal(), identity() formas y tipos de línea.
51 / 82

4. Escalas scale_x_ooo -scale_y_ooo

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)")

52 / 82

4. Escalas scale_x_ooo -scale_y_ooo

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)")

53 / 82

4. Escalas scale_x_ooo -scale_y_ooo

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))

54 / 82

4. Escalas scale_x_ooo -scale_y_ooo

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!!!"'
)
)

55 / 82

4. Escalas scale_color_ooo -scale_fill_ooo

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"
))

56 / 82

4. Escalas scale_color_ooo -scale_fill_ooo

Renombrar la leyenda:

ggplot(chic, aes(date, temp)) +
geom_point(aes(color = season)) +
scale_color_manual(
values = c(
"red",
"green",
"blue",
"yellow"
),
name = "Temporada:")

57 / 82

4. Escalas scale_color_ooo -scale_fill_ooo

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)

58 / 82

Sistema de coordenadas

coord_

59 / 82

5. Sistema de coordenadas 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:

  • coord_cartesian(): el valor predeterminado con dos ejes orientados perpendiculares fijos
  • coord_flip(): un sistema de coordenadas cartesianas con ejes invertidos
  • coord_fixed(): un sistema de coordenadas cartesianas con una relación de aspecto fija

Sistemas de coordenadas no lineales que probablemente cambian las formas:

  • coord_map(): proyecciones de mapas
  • coord_polar(): un sistema de coordenadas polares
  • coord_trans(): transformaciones arbitrarias en las posiciones x - y
60 / 82

5. Sistema de coordenadas coord_cartesian()

ggplot(chic, aes(date, temp)) +
geom_line() +
coord_cartesian(
ylim = c(50, 70)
)

61 / 82

5. Sistema de coordenadas coord_cartesian()

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)
)

62 / 82

5. Sistema de coordenadas coord_flip()

ggplot(chic, aes(season, temp)) +
geom_col()

ggplot(chic, aes(season, temp)) +
geom_col() +
coord_flip()

63 / 82

5. Sistema de coordenadas coord_polar()

ggplot(chic, aes(season, temp)) +
geom_col()

ggplot(chic, aes(season, temp)) +
geom_col() +
coord_polar()

64 / 82

Facetas - Paneles

facet_

65 / 82

6. Facetas facet_wrap()

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)

66 / 82

6. Facetas facet_grid()

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)

67 / 82

6. Facetas facet_grid()

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)

68 / 82

6. Facetas facet_grid()

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 ~.)

69 / 82

Características visuales

theme() - theme_

70 / 82

7. Características visuales

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

71 / 82

7. Características visuales

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"
)
)

72 / 82

7. Características visuales

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()
)

73 / 82

7. Características visuales

ggplot(chic, aes(date, temp)) +
geom_point() +
theme_gray()

ggplot(chic, aes(date, temp)) +
geom_point() +
theme_minimal()

74 / 82

Mas recursos

75 / 82

Libros:

...

76 / 82

Extenciones: - patchwork

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

77 / 82

Extenciones: - cowplot

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)

78 / 82

Extenciones: - ggrepel

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")

79 / 82

Extenciones: - ggalt

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())

80 / 82

Extenciones: - ggtext

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)
)

81 / 82

{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.

Descripción ggplot2

2 / 82
Paused

Help

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