-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy path03-intro-ggplot2.Rmd
271 lines (206 loc) · 9.3 KB
/
03-intro-ggplot2.Rmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
# Visualizacion con ggplot2
Utilizaremos el paquete `ggplot2`, fue desarrollado por Hadley Wickham y es
una implementación de la gramática de las gráficas [@wilkinson2005]. Si no lo
tienes instalado comienza instalando el paquete `ggplot2` o el `tidyverse` que
lo incluye.
## Gráficas de dispersión {-}
```{r}
library(tidyverse) # Cargamos el paquete en nuestra sesión
```
Usaremos el conjunto de datos `election_sub_2012` que se incluye en el paquete
`estcomp`, puedes encontrar información de esta base de datos tecleando
`?election_sub_2012`.
```{r}
library(estcomp)
data(election_sub_2012)
?election_sub_2012
glimpse(election_sub_2012)
```
Comencemos con nuestra primera gráfica:
```{r plot_dispersion, fig.width = 5.5, fig.height = 4}
ggplot(election_sub_2012) +
geom_point(aes(x = total, y = prd_pt_mc))
```
En `ggplot2` se inicia una gráfica con la instrucción `ggplot()`, debemos
especificar explicitamente que base de datos usamos, este es el primer argumento
en la función `ggplot()`. Una vez que creamos la base añadimos
*capas*, y dentro de *aes()* escribimos las variables que queremos
graficar y el atributo de la gráfica al que queremos mapearlas.
La función `geom_point()` añade una capa de puntos, hay muchas funciones
*geometrías* incluídas en `ggplot2`: `geom_line()`, `geom_boxplot()`,
`geom_histogram`,... Cada una acepta distintos argumentos para mapear las
variables en los datos a características estéticas de la gráfica. En el ejemplo
de arriba mapeamos `displ` al eje x, `prd_pt_mc` al eje y. Sin embargo, con
`geom_point()` podemos representar más de 2 variables usando la forma, color y/o tamaño del punto.
Esta flexibilidad nos permite descubrir patrones más interesantes en
los datos.
```{r plot_dispersion_color, fig.width = 5.5, fig.height = 4}
ggplot(election_sub_2012) +
geom_point(aes(x = total, y = prd_pt_mc, color = polling_type))
```
![](img/manicule2.jpg) Experimenta con los _aesthetics_ color (color),
tamaño (size) y forma (shape).
* ¿Qué diferencia hay entre las variables categóricas y las continuas?
* ¿Qué ocurre cuando combinas varios _aesthetics_?
El mapeo de las propiedades estéticas se denomina escalamiento y depende del
tipo de variable, las variables discretas (por ejemplo, tipo de casilla, región,
estado) se mapean a distintas escalas que las variables continuas (variables
numéricas como voto por un partido, lista nominal, etc.), los *defaults* de
escalamiento para algunos atributos son (los escalamientos se pueden modificar):
aes |Discreta |Continua
----------|--------------|---------
Color (`color`)|Arcoiris de colores |Gradiente de colores
Tamaño (`size`) |Escala discreta de tamaños |Mapeo lineal entre el área y el valor
Forma (`shape`) |Distintas formas |No aplica
Transparencia (`alpha`) | No aplica | Mapeo lineal a la transparencia
Los *_geoms_* controlan el tipo de gráfica
```{r plot_linea, fig.width = 5, fig.height = 4}
p <- ggplot(election_sub_2012, aes(x = total, y = prd_pt_mc))
p + geom_line()
```
¿Qué problema tiene la siguiente gráfica?
```{r plot_jitter, fig.width = 5, fig.height = 4}
p <- ggplot(election_sub_2012, aes(x = pan_pct, y = prd_pt_mc_pct))
p + geom_point(size = 0.8)
p + geom_jitter(size = 0.5)
```
![](img/manicule2.jpg) ¿Cómo podemos mejorar la siguiente gráfica?
```{r plot_edo_prd, fig.width = 6, fig.height = 4}
ggplot(election_sub_2012, aes(x = state_abbr, y = prd_pt_mc_pct)) +
geom_point(size = 0.8)
```
Intentemos reodenar los niveles de la variable clase
```{r, fig.width = 6, fig.height = 4}
ggplot(election_sub_2012, aes(x = reorder(state_abbr, prd_pt_mc),
y = prd_pt_mc)) +
geom_point(size = 0.8)
```
Podemos probar otros geoms.
```{r edo_boxplot, fig.width = 6, fig.height = 4}
ggplot(election_sub_2012, aes(x = reorder(state_abbr, prd_pt_mc),
y = prd_pt_mc)) +
geom_jitter(size = 0.5)
ggplot(election_sub_2012, aes(x = reorder(state_abbr, prd_pt_mc),
y = prd_pt_mc)) +
geom_boxplot()
```
También podemos usar más de un geom!
```{r, fig.width = 6, fig.height = 3.5}
ggplot(election_sub_2012, aes(x = reorder(state_abbr, prd_pt_mc),
y = prd_pt_mc)) +
geom_jitter(size = 0.5) +
geom_boxplot()
```
Y mejorar presentación:
```{r, fig.width = 6, fig.height = 3.5}
ggplot(election_sub_2012, aes(x = reorder(state_abbr, prd_pt_mc),
y = prd_pt_mc)) +
geom_jitter(alpha = 0.6, size = 0.5) +
geom_boxplot(outlier.color = NA) +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
labs(title = "Votos por casilla y estado",
subtitle = "PRD-PT-MC", x = "estado", y = "total de votos")
```
![](img/manicule2.jpg) Lee la ayuda de _reorder_ y repite las gráficas
anteriores ordenando por la mediana de _prd_pt_mc_.
* ¿Cómo harías
para graficar los puntos encima de las cajas de boxplot?
## Paneles {-}
Ahora veremos como hacer gráficas de paneles, la idea es hacer varios múltiplos
de una gráfica donde cada múltiplo representa un subconjunto de los datos, es
una práctica muy útil para explorar relaciones condicionales.
En ggplot podemos usar _facet\_wrap()_ para hacer paneles dividiendo los datos
de acuerdo a las categorías de una sola variable. Comenzamos
por una gráfica de dispersión (interpreta la recta roja):
```{r}
ggplot(election_sub_2012, aes(x = pri_pvem_pct, y = pan_pct)) +
geom_abline(intercept = 50, slope = -1, colour = "red") +
geom_jitter()
```
Sabemos que hay diferencias regionales en los patrones de votación. Podemos entonces repetir la
misma gráfica para distintas regiones:
```{r}
ggplot(election_sub_2012, aes(x = pri_pvem_pct, y = pan_pct)) +
geom_abline(intercept = 50, slope = -1, colour = "red") +
geom_jitter() +
facet_wrap(~region)
```
También podemos hacer una cuadrícula de $2$ dimensiones usando
`facet\_grid(filas~columnas)`. En este caso, también mostramos los resultados por
tipo de casilla:
```{r, fig.width = 5, fig.height = 8}
# Veremos como manipular datos en las próximas clases
election_region_2012 <- election_2012 |>
group_by(region, section_type) |>
summarise_at(vars(pri_pvem:total), sum) |>
mutate_at(vars(pri_pvem:otros), .funs = ~ 100 * ./total) |>
ungroup() |>
mutate(region = reorder(region, pri_pvem)) |>
gather(party, pct_votes, pri_pvem:otros) |>
filter(!is.na(section_type))
ggplot(election_region_2012, aes(x = reorder(party, pct_votes),
y = pct_votes, fill = reorder(party, -pct_votes))) +
geom_col(show.legend = FALSE) +
facet_grid(region ~ section_type) +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
```
Los páneles pueden ser muy útiles para entender relaciones en nuestros datos. En
la siguiente gráfica es difícil entender si existe una relación entre radiación
solar y ozono.
```{r, fig.width = 4, fig.height = 3}
data(airquality)
ggplot(airquality, aes(x = Solar.R, y = Ozone)) +
geom_point()
```
Veamos que ocurre si realizamos páneles separando por velocidad del viento.
```{r, fig.width = 7, fig.height = 3, message = FALSE, warning = FALSE}
airquality$Wind.cat <- cut(airquality$Wind, breaks = c(1.5, 9, 12, 21))
ggplot(airquality, aes(x = Solar.R, y = Ozone)) +
geom_point() +
facet_wrap(~ Wind.cat)
```
Podemos agregar un suavizador (loess) para ver mejor la relación de las
variables en cada panel.
```{r, fig.width = 7, fig.height = 3, warning = FALSE}
ggplot(airquality, aes(x = Solar.R, y = Ozone)) +
geom_point() +
facet_wrap(~ Wind.cat) +
geom_smooth(method = "lm")
```
Notamos que la relación entre radiación solar y ozono es positiva cuando la
velocidad del viento es baja, sin embargo la pendiente de la recta disminuye
con la velocidad del viento. Al incluir una tercer variable al análisis (velocidad del
viento) podemos entender mejor los datos.
#### Ejercicio {-}
Como vimos en el caso de los resultados electorales por región, en ocasiones es
necesario realizar transformaciones u obtener subconjuntos de los datos para
poder responder preguntas de nuestro interés.
```{r}
library(dplyr)
library(babynames)
glimpse(babynames)
```
Supongamos que queremos ver la tendencia del nombre "John", para ello debemos
generar un subconjunto de la base de datos. ¿Qué ocurre en la siguiente gráfica?
```{r, fig.width = 5, fig.height = 3}
babynames_John <- filter(babynames, name == "John")
ggplot(babynames_John, aes(x = year, y = prop)) +
geom_line()
```
```{r, fig.width = 5, fig.height = 3.7, eval=FALSE, echo=FALSE, include =FALSE}
ggplot(babynames_John, aes(x = year, y = prop, color = sex)) +
geom_line()
```
La preparación de los datos es un aspecto muy importante del análisis y suele
ser la fase que lleva más tiempo. Es por ello que el siguiente tema se enfocará
en herramientas para hacer transformaciones de manera eficiente.
## Recursos {-}
* El libro *R for Data Science* [@r4ds] tiene un capítulo de visualización.
* Documentación con ejemplos en la página de
[ggplot2](http://ggplot2.tidyverse.org/).
* Otro recurso muy útil es el
[acordeón de ggplot](https://rstudio.github.io/cheatsheets/data-visualization.pdf).
* La teoría detrás de ggplot2 se explica en el libro de ggplot2 [@wickham2009],
* Google, [stackoverflow](https://stackoverflow.com/questions/tagged/ggplot2) y
[RStudio Community](https://community.rstudio.com/tags/ggplot2) tienen un *tag*
para preguntas relacionadas con ggplot2.