-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path10-graficos-III.Rmd
253 lines (194 loc) · 13.1 KB
/
10-graficos-III.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
---
title: "Apariencia de gráficos"
output:
html_document:
code_download: true
toc: true
toc_float: true
highlight: tango
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE,
message = FALSE)
library(ggplot2)
library(dplyr)
library(readr)
library(metR)
```
## Escalas
[Previamente](06-graficos-I.html) comentamos que el *mapeo* de una variable en un elemento geométrico, por ejemplo cuando le asignamos distintos colores a los puntos que representan cada tipo de temperatura, usa una **escala** para definir, en este caso, que color le corresponde a cada elemento.
También cambiamos la apariencia del relleno (o `fill`) de los contornos y la forma de los puntos (o `shape`). Para esto, {ggplot2} siempre usa una escala que podemos modificar de acuerdo a nuestro gusto y teniendo en cuenta cómo queremos comunicar nuestros resultados.
Por supuesto, modificar una escala implica sumar una nueva capa al gráfico sumando una nueva función. Todas las funciones de escala comienzan con `scale` (de escala en inglés), el tipo de apariencia que queremos modificar (`color`, `fill`, `shape`, etc) y en muchos casos un nombre o una característica de esa escala.
Para mostrar como funciona, vamos a descargar datos de las estaciones meteorológicas del Servicio Meteorológico Nacional para el mes de agosto de 2020 y con suerte al final de este documento tendremos un gráfico listo para publicar.
Pero por supuesto, primero tenemos que manipular los datos para poder utilizarlos. En particular necesitaremos información de las estaciones, sus metadatos, que se encuentran en un archivo distinto. Y de paso calculamos la variable que nos interesa: la temperatura máxima media para agosto.
```{r}
observaciones <- readr::read_csv("datos/observaciones_smn.csv") %>%
group_by(station) %>%
summarise(tmax_media = mean(tmax, na.rm = TRUE),
tmax_var = sd(tmax, na.rm = TRUE),)
estaciones <- read_csv("datos/estaciones_smn.csv")
observaciones <- left_join(observaciones, estaciones, by = c("station" = "nombre")) %>%
filter(provincia != "ANTARTIDA")
```
```{r}
observaciones %>%
filter(provincia != "ANTARTIDA") %>%
ggplot(aes(lon, lat)) +
geom_point()
```
Por ahora este gráfico no nos dice nada, necesitamos agregarle una capa con el mapa tal cual hicimos previamente.
```{r}
mapa <- rnaturalearth::ne_states(country = c("argentina"), returnclass = "sf")
observaciones %>%
filter(provincia != "ANTARTIDA") %>%
ggplot(aes(lon, lat)) +
geom_point() +
geom_sf(data = mapa, fill = NA, color = "black", size = 0.2, inherit.aes = FALSE)
```
### Escala de colores y otras características
Si bien ahora podemos identificar donde están las estaciones, no tenemos información de la temperatura máxima media. Podríamos cambiar el color de los puntos para que representen el valor que toma esa variable en cada estación.
```{r}
observaciones %>%
filter(provincia != "ANTARTIDA") %>%
ggplot(aes(lon, lat)) +
geom_point(aes(color = tmax_media)) +
geom_sf(data = mapa, fill = NA, color = "black", size = 0.2, inherit.aes = FALSE)
```
Pero esta escala de colores que usa {ggplot2} por defecto no es de las mejores, es difícil diferenciar entre los valores. Existen infinitas paletas de colores que se pueden usar en ggplot, algunas por ejemplo buscan poder distinguirse si imprimimos el gráfico en blanco y negro, otras están diseñadas para que personas con daltonismo puedan distinguir los colores. Una escala o paleta de colores muy usada es [**viridis**](https://cran.r-project.org/web/packages/viridis/vignettes/intro-to-viridis.html) que fue creada justamente para resolver este y otros problemas. También existe otra gran familia de paletas de colores llamada [**ColorBrewer**](https://colorbrewer2.org/).
Vamos a probar la paleta "YlOrRd" , esta paleta es *secuencial* y es justo lo que necesitamos para visualizar una variable continua como la temperatura. Cómo estamos modificando el *color*, la función a usar será `scale_color_distiller()`, la hermana *continua* de `scale_color_brewer()`:
```{r}
observaciones %>%
filter(provincia != "ANTARTIDA") %>%
ggplot(aes(lon, lat)) +
geom_point(aes(color = tmax_media)) +
geom_sf(data = mapa, fill = NA, color = "black", size = 0.2, inherit.aes = FALSE) +
scale_color_distiller(palette = "YlOrRd", direction = 1)
```
En este caso también agregamos el argumento `direction = 1` para que la paleta de colores los muestre de más oscuros a más claros. Esta decisión es estética y muchas veces depende de las variables a graficar.
::: {.alert .alert-info}
**Desafío**
A modo de prueba, cambia la paleta de colores actual por la de Viridis. Para eso tenés que usar `scale_color_viridis_c()`. La "c" del final viene de *continuous* y se usa para variables continuas, mientras que si los datos son discretos o categorías, se usa "d" al final.
:::
Nuestro gráfico va quedando mejor y podemos aprovechar la capacidad de {ggplot2} de *mapear* variables a los elementos del gráfico y visualizar la variabilidad de la temperatura máxima modificando el tamaño de los puntos de acuerdo al desvío estándar.
```{r}
observaciones %>%
filter(provincia != "ANTARTIDA") %>%
ggplot(aes(lon, lat)) +
geom_point(aes(color = tmax_media, size = tmax_var)) +
geom_sf(data = mapa, fill = NA, color = "black", size = 0.2, inherit.aes = FALSE) +
scale_color_distiller(palette = "YlOrRd", direction = 1)
```
Es interesante ver como las temperaturas máximas medias mayores también tienen mayor variabilidad. Pero ahora algunos puntos se superponen y es posible que no estemos viendo algunas estaciones. Vamos a arreglar eso agregando transparencia y de paso modificar el tamaño de los puntos con la escala correspondiente `scale_size_area()` y sacar la legenda con `guide = NULL`.
```{r}
observaciones %>%
filter(provincia != "ANTARTIDA") %>%
ggplot(aes(lon, lat)) +
geom_point(aes(color = tmax_media, size = tmax_var), alpha = 0.7) +
geom_sf(data = mapa, fill = NA, color = "black", size = 0.2, inherit.aes = FALSE) +
scale_color_distiller(palette = "YlOrRd", direction = 1) +
scale_size_area(max_size = 4, guide = NULL)
```
### Escalas de ejes
Ahora que la información del gráfico se ve bien, pasemos a los ejes. Al igual que para el color, el tamaño y otros elementos del gráfico, para los ejes también existen funciones "scale". En este caso las escalas que modifican los ejes justamente comienzan con `scala_x_` o `scale_y_` según sea el caso y hay una gran variedad de opciones dependiendo del tipo de dato que estamos graficando en cada eje.
Si en el eje y graficamos una variable discreta entonces podremos modificar su aspecto con `scale_y_discrete()`. En este caso la función `geom_sf()` automáticamente modifica la apariencia de los ejes y no requieren de mucho trabajo.
Pero queremos que nuestro gráfico quede listo para publicar y la "W" de west (oeste en inglés) puede no ser muy amigable. Modifiquemos entonces el eje x con la función `scale_x_continuous()`. En este caso queremos modificar las etiquetas o `labels` y para eso usaremos la función `LonLabel()` del paquete {metR}. Esta función recibe una función anónima que toma cada longitud y el cambia el "°W° por "°O".
```{r}
observaciones %>%
filter(provincia != "ANTARTIDA") %>%
ggplot(aes(lon, lat)) +
geom_point(aes(color = tmax_media, size = tmax_var), alpha = 0.7) +
geom_sf(data = mapa, fill = NA, color = "black", size = 0.2, inherit.aes = FALSE) +
scale_color_distiller(palette = "YlOrRd", direction = 1) +
scale_size_area(max_size = 4, guide = NULL) +
scale_x_continuous(labels = function(x) LonLabel(x, west = "°O"))
```
## Elementos de texto
Ya sumamos 3 escalas y el gráfico ya se ve muy bien. ¿Cómo hacemos si queremos identificar estaciones individuales? Por ahora es difícil, pero podríamos agregar etiquetas de texto con el nombre de cada estación al lado de cada punto usando `geom_text()`, y en este caso la apariencia está dada por `label` o etiqueta:
```{r}
observaciones %>%
filter(provincia != "ANTARTIDA") %>%
ggplot(aes(lon, lat)) +
geom_point(aes(color = tmax_media, size = tmax_var), alpha = 0.7) +
geom_sf(data = mapa, fill = NA, color = "black", size = 0.2, inherit.aes = FALSE) +
scale_color_distiller(palette = "YlOrRd", direction = 1) +
scale_size_area(max_size = 4, guide = NULL) +
scale_x_continuous(labels = function(x) LonLabel(x, west = "°O")) +
geom_text(aes(label = station))
```
Pero nos olvidamos que tenemos más de 100 estaciones, es imposible agregarle etiquetas a todos. Pero podríamos querer resaltar algunos, tal vez los de una región en particular o los que cumplen con la condición de tener las mayores temperaturas máximas medias. Para eso vamos a generarnos una nueva tabla con las estaciones que queremos resaltar y de paso usarla dentro de `geom_text()`.
```{r}
extremos_temperatura <- observaciones %>%
filter(provincia != "ANTARTIDA") %>%
filter(tmax_media == max(tmax_media, na.rm = TRUE) |
tmax_media == min(tmax_media, na.rm = TRUE)) # Estaciones con extremos!
observaciones %>%
filter(provincia != "ANTARTIDA") %>%
ggplot(aes(lon, lat)) +
geom_point(aes(color = tmax_media, size = tmax_var), alpha = 0.7) +
geom_sf(data = mapa, fill = NA, color = "black", size = 0.2, inherit.aes = FALSE) +
scale_color_distiller(palette = "YlOrRd", direction = 1) +
scale_size_area(max_size = 4, guide = NULL) +
scale_x_continuous(labels = function(x) LonLabel(x, west = "°O")) +
geom_text(aes(label = station),
data = extremos_temperatura, # Esta capa usa la tabla extremos_temperatura!
size = 2.5)
```
::: {.alert .alert-success}
Del código anterior surge algo muy importante: es posible generar capas en un gráfico usando una data.frame *distinto* al que usamos para graficar las capas anteriores. Esto es útil principalmente para definir etiquetas o resaltar determinadas observaciones.
Y el truco está en que ambos data.frames tienen las variables `lon` y `lat` y entonces {ggplot2} puede identificar en que parte del gráfico (en que valores de x y en que valores de y) colocar cada elemento.
:::
Veamos ahora una (de varias) maneras agregar o modificar elementos de texto en el gráfico. Vamos a usar una nueva función (y una nueva capa!), `labs()`:
```{r}
observaciones %>%
filter(provincia != "ANTARTIDA") %>%
ggplot(aes(lon, lat)) +
geom_point(aes(color = tmax_media, size = tmax_var), alpha = 0.7) +
geom_sf(data = mapa, fill = NA, color = "black", size = 0.2, inherit.aes = FALSE) +
scale_color_distiller(palette = "YlOrRd", direction = 1) +
scale_size_area(max_size = 4, guide = NULL) +
scale_x_continuous(labels = function(x) LonLabel(x, west = "°O")) +
geom_text(aes(label = station),
data = extremos_temperatura, # Esta capa usa la tabla extremos_temperatura!
size = 2.5) +
labs(title = "Temperatura máxima media",
subtitle = "Agosto",
caption = "El tamaño de cada circulo representa la variabilidad",
x = "Longitud",
y = "Latitud",
color = "")
```
Agregamos un título, un subtitulo, el epígrafe de la figura (*caption*) para las aclaraciones y cambiamos el nombre de los ejes para que se vean mejor. Pero ademas eliminamos el nombre de la leyenda porque era un poco redundante (ya está en el título).
## Temas
Nos queda una última cosa por hacer, cambiar la apariencia global del gráfico. {ggplot2} tiene muchos *temas* disponibles y para todos los gustos. Pero además hay otros paquetes que extienden las posibilidades, por ejemplo [{ggthemes}](https://github.com/jrnold/ggthemes).
Por defecto {ggplot2} usa `theme_grey()`, probemos `theme_light()`:
```{r}
observaciones %>%
filter(provincia != "ANTARTIDA") %>%
ggplot(aes(lon, lat)) +
geom_point(aes(color = tmax_media, size = tmax_var), alpha = 0.7) +
geom_sf(data = mapa, fill = NA, color = "black", size = 0.2, inherit.aes = FALSE) +
scale_color_distiller(palette = "YlOrRd", direction = 1) +
scale_size_area(max_size = 4, guide = NULL) +
scale_x_continuous(labels = function(x) LonLabel(x, west = "°O")) +
geom_text(aes(label = station),
data = extremos_temperatura, # Esta capa usa la tabla extremos_temperatura!
size = 2.5) +
labs(title = "Temperatura máxima media",
subtitle = "Agosto",
caption = "El tamaño de cada circulo representa la variabilidad",
x = "Longitud",
y = "Latitud",
color = "") +
theme_light()
```
::: {.alert .alert-info}
**Desafío**
Ahora es tu turno. Elegí un [tema que te guste](https://es.r4ds.hadley.nz/images/visualization-themes.png){.alert-link} y probalo. Además, si se te ocurre algún título mejor modificalo!
:::
::: {.alert .alert-success}
Junto con las funciones `theme_...()`, hay una función llamada `theme()` que permite cambiar la apariencia de cualquier elemento del gráfico. Tiene casi infinitas opciones y si algún momento te desvelas intentando cambiar esa línea o ese borde, seguro que `theme()` tiene alguna opción para hacer eso.
:::
<div class="btn-group" role="group" aria-label="Navegación">
<a href= "09-graficos-II.html" class = "btn btn-primary">Anterior</a>
<a href= "11-reportes-II.html" class = "btn btn-primary">Siguiente</a>
</div>