Ocultar código
library(glue)
library(ggtext)
library(showtext)
library(tidyverse)Sitio en construcción
Víctor Gauto
17 de diciembre de 2025
Efecto de la eliminación de dos observaciones en las mediciones de plomo en agua, en la ciudad de Flint (EE.UU.)

Colores.
Fuentes: Ubuntu y JetBrains Mono.
fuente <- glue(
"Datos: <span style='color:{c1};'><span style='font-family:jet;'>",
"{{<b>tidytuesdayR</b>}}</span> semana 44, ",
"<b> Using Flint, Michigan, lead data in introductory statistics</b>",
" Loux y Gibson (2018)</span>."
)
autor <- glue("<span style='color:{c1};'>**Víctor Gauto**</span>")
icon_twitter <- glue("<span style='font-family:jet;'></span>")
icon_instagram <- glue("<span style='font-family:jet;'></span>")
icon_github <- glue("<span style='font-family:jet;'></span>")
icon_mastodon <- glue("<span style='font-family:jet;'>󰫑</span>")
icon_bsky <- glue("<span style='font-family:jet;'></span>")
usuario <- glue("<span style='color:{c1};'>**vhgauto**</span>")
sep <- glue("**|**")
mi_caption <- glue(
"{fuente}<br>{autor} {sep} {icon_github} {icon_twitter} {icon_instagram} ",
"{icon_mastodon} {icon_bsky} {usuario}"
)Me interesa ver cómo se modificaron los límite debido la eliminación de dos valores. Creo dos paneles, el superior con todas las mediciones; y el inferior, con los datos modificados que reducen el valor límite.
Calculo los cuartiles 90 de las mediciones de plomo.
Función para dar formato a los valores y el límite ambiental.
Acomodo los datos e indico si las mediciones son las originales o modificadas.
d <- select(flint_mdeq, -notes, -sample) |>
pivot_longer(
cols = contains("lead"),
values_to = "valor",
names_to = "medición"
) |>
mutate(eliminado = if_else(is.na(valor), TRUE, FALSE)) |>
fill(valor) |>
mutate(
medición = factor(
medición,
levels = c("lead", "lead2"),
labels = c("Medición original", "Medición alterada")
)
)Anotaciones a los paneles, tamaño de texto y título de la figura.
text_tamaño <- 7
text1 <- glue(
"El **Departamento Ambiental de Michigan**<br>midió plomo en ",
"<b style='color: {c6};'>{nrow(flint_mdeq)} muestras de agua</b>."
)
text2 <- glue(
"El valor del cuartil 90 fue de ",
"<b style='color: {c1};'>{l1} ppb</b>, **superior**<br>al ",
"<b style='color: {c3};'>límite</b> dado por la Agencia de Protección<br>",
"Ambiental (<b style='color: {c3};'>{lim} ppb</b>)."
)
text3 <- glue(
"Se decidió <b style='color: {c5};'>eliminar dos mediciones</b>.<br>",
"Debido esto el cuartil 90 descendió a<br>",
"<b style='color: {c2};'>{formato(l2)} ppb</b>, ",
"debajo del <b style='color: {c3};'>límite ambiental</b>."
)
text4 <- glue(
"Mediciones independientes arrojaron<br>que el valor era ",
"superior (<b style='color: {c7};'>{formato(l3)} ppb</b>)"
)
mi_titulo <- glue(
"Crisis del Agua en <b style='color: {c7};'>Flint</b> ",
"(Michigan, EE.UU) en 2015"
)Figura.
g <- ggplot(
d,
aes(valor, y = "1", color = eliminado, shape = eliminado, alpha = eliminado)
) +
geom_vline(xintercept = l1, layout = 1, color = c1, linewidth = 2) +
geom_vline(xintercept = l2, layout = 2, color = c2, linewidth = 2) +
geom_vline(
xintercept = l3,
layout = 2,
color = c7,
linewidth = 1,
linetype = 3
) +
geom_vline(xintercept = lim, linetype = 2, color = c3, linewidth = 1) +
ggbeeswarm::geom_quasirandom(cex = 4, width = .6, stroke = 2) +
annotate(
geom = "richtext",
x = I(c(.99, .21)),
y = I(c(.99, .01)),
label = c(text1, text2),
family = "ubuntu",
size = text_tamaño,
fill = NA,
label.color = NA,
layout = 1,
hjust = c(1, 0),
vjust = c(1, 0)
) +
annotate(
geom = "richtext",
x = I(c(.99, .28)),
y = I(c(.99, .01)),
label = c(text3, text4),
family = "ubuntu",
size = text_tamaño,
fill = NA,
label.color = NA,
layout = 2,
hjust = c(1, 0),
vjust = c(1, 0)
) +
facet_wrap(vars(medición), ncol = 1, axes = "all_x") +
scale_x_continuous(
breaks = scales::breaks_width(10),
expand = expansion(mult = 0, add = 2)
) +
scale_color_manual(
breaks = c(TRUE, FALSE),
values = c(c2, c6)
) +
scale_shape_manual(values = c(20, 4)) +
scale_alpha_manual(values = c(.5, 1)) +
labs(
title = mi_titulo,
x = "Concentración de **plomo** (partes por mil de millón, 10<sup>-9</sup>)",
caption = mi_caption
) +
ggthemes::theme_par(base_family = "ubuntu", base_size = 15) +
theme_sub_legend(position = "none") +
theme_sub_plot(
background = element_rect(fill = c4),
title = element_markdown(size = rel(1.8), face = "plain"),
margin = margin_auto(25),
caption = element_markdown(
color = c2,
hjust = .5,
size = rel(.9),
margin = margin(t = 20),
lineheight = 1.3
)
) +
theme_sub_axis_y(
text = element_blank(),
ticks = element_blank(),
title = element_blank()
) +
theme_sub_axis_x(title = element_markdown(size = rel(1.2))) +
theme_sub_strip(
background = element_blank(),
text = element_text(hjust = 0, size = rel(1.2))
)Guardo.
---
format:
html:
code-fold: show
code-summary: "Ocultar código"
code-line-numbers: false
code-annotations: false
code-link: true
code-tools:
source: true
toggle: true
caption: "Código"
code-overflow: scroll
page-layout: full
editor_options:
chunk_output_type: console
categories:
- geom_vline
- geom_quasirandom
execute:
eval: false
echo: true
warning: false
title: "Semana 44"
date: last-modified
author: Víctor Gauto
---
[Efecto de la eliminación](https://doi.org/10.1111/test.12187) de dos observaciones en las mediciones de plomo en agua, en la ciudad de Flint (EE.UU.)
::: {.column-page-right}

:::
## Paquetes
```{r}
library(glue)
library(ggtext)
library(showtext)
library(tidyverse)
```
## Estilos
Colores.
```{r}
c1 <- "#326812"
c2 <- "#C31E6E"
c3 <- "#7640A9"
c4 <- "grey96"
c5 <- "#EF5FAF"
c6 <- "#659A32"
c7 <- "#4C7D96"
```
Fuentes: Ubuntu y JetBrains Mono.
```{r}
font_add(
family = "ubuntu",
regular = "././fuente/Ubuntu-Regular.ttf",
bold = "././fuente/Ubuntu-Bold.ttf",
italic = "././fuente/Ubuntu-Italic.ttf"
)
font_add(
family = "jet",
regular = "././fuente/JetBrainsMonoNLNerdFontMono-Regular.ttf"
)
showtext_auto()
showtext_opts(dpi = 300)
```
## Epígrafe
```{r}
fuente <- glue(
"Datos: <span style='color:{c1};'><span style='font-family:jet;'>",
"{{<b>tidytuesdayR</b>}}</span> semana 44, ",
"<b> Using Flint, Michigan, lead data in introductory statistics</b>",
" Loux y Gibson (2018)</span>."
)
autor <- glue("<span style='color:{c1};'>**Víctor Gauto**</span>")
icon_twitter <- glue("<span style='font-family:jet;'></span>")
icon_instagram <- glue("<span style='font-family:jet;'></span>")
icon_github <- glue("<span style='font-family:jet;'></span>")
icon_mastodon <- glue("<span style='font-family:jet;'>󰫑</span>")
icon_bsky <- glue("<span style='font-family:jet;'></span>")
usuario <- glue("<span style='color:{c1};'>**vhgauto**</span>")
sep <- glue("**|**")
mi_caption <- glue(
"{fuente}<br>{autor} {sep} {icon_github} {icon_twitter} {icon_instagram} ",
"{icon_mastodon} {icon_bsky} {usuario}"
)
```
## Datos
```{r}
tuesdata <- tidytuesdayR::tt_load(2025, 44)
flint_mdeq <- tuesdata$flint_mdeq
flint_vt <- tuesdata$flint_vt
```
## Procesamiento
Me interesa ver cómo se modificaron los límite debido la eliminación de dos valores. Creo dos paneles, el superior con todas las mediciones; y el inferior, con los datos modificados que reducen el valor límite.
Calculo los cuartiles 90 de las mediciones de plomo.
```{r}
l1 <- quantile(flint_mdeq$lead, probs = .9, na.rm = TRUE)
l2 <- quantile(flint_mdeq$lead2, probs = .9, na.rm = TRUE)
l3 <- quantile(flint_vt$lead, probs = .9, na.rm = TRUE)
```
Función para dar formato a los valores y el límite ambiental.
```{r}
formato <- \(q) {
format(q, decimal.mark = ",", big.mark = ".")
}
lim <- 15
```
Acomodo los datos e indico si las mediciones son las originales o modificadas.
```{r}
d <- select(flint_mdeq, -notes, -sample) |>
pivot_longer(
cols = contains("lead"),
values_to = "valor",
names_to = "medición"
) |>
mutate(eliminado = if_else(is.na(valor), TRUE, FALSE)) |>
fill(valor) |>
mutate(
medición = factor(
medición,
levels = c("lead", "lead2"),
labels = c("Medición original", "Medición alterada")
)
)
```
## Figura
Anotaciones a los paneles, tamaño de texto y título de la figura.
```{r}
text_tamaño <- 7
text1 <- glue(
"El **Departamento Ambiental de Michigan**<br>midió plomo en ",
"<b style='color: {c6};'>{nrow(flint_mdeq)} muestras de agua</b>."
)
text2 <- glue(
"El valor del cuartil 90 fue de ",
"<b style='color: {c1};'>{l1} ppb</b>, **superior**<br>al ",
"<b style='color: {c3};'>límite</b> dado por la Agencia de Protección<br>",
"Ambiental (<b style='color: {c3};'>{lim} ppb</b>)."
)
text3 <- glue(
"Se decidió <b style='color: {c5};'>eliminar dos mediciones</b>.<br>",
"Debido esto el cuartil 90 descendió a<br>",
"<b style='color: {c2};'>{formato(l2)} ppb</b>, ",
"debajo del <b style='color: {c3};'>límite ambiental</b>."
)
text4 <- glue(
"Mediciones independientes arrojaron<br>que el valor era ",
"superior (<b style='color: {c7};'>{formato(l3)} ppb</b>)"
)
mi_titulo <- glue(
"Crisis del Agua en <b style='color: {c7};'>Flint</b> ",
"(Michigan, EE.UU) en 2015"
)
```
Figura.
```{r}
g <- ggplot(
d,
aes(valor, y = "1", color = eliminado, shape = eliminado, alpha = eliminado)
) +
geom_vline(xintercept = l1, layout = 1, color = c1, linewidth = 2) +
geom_vline(xintercept = l2, layout = 2, color = c2, linewidth = 2) +
geom_vline(
xintercept = l3,
layout = 2,
color = c7,
linewidth = 1,
linetype = 3
) +
geom_vline(xintercept = lim, linetype = 2, color = c3, linewidth = 1) +
ggbeeswarm::geom_quasirandom(cex = 4, width = .6, stroke = 2) +
annotate(
geom = "richtext",
x = I(c(.99, .21)),
y = I(c(.99, .01)),
label = c(text1, text2),
family = "ubuntu",
size = text_tamaño,
fill = NA,
label.color = NA,
layout = 1,
hjust = c(1, 0),
vjust = c(1, 0)
) +
annotate(
geom = "richtext",
x = I(c(.99, .28)),
y = I(c(.99, .01)),
label = c(text3, text4),
family = "ubuntu",
size = text_tamaño,
fill = NA,
label.color = NA,
layout = 2,
hjust = c(1, 0),
vjust = c(1, 0)
) +
facet_wrap(vars(medición), ncol = 1, axes = "all_x") +
scale_x_continuous(
breaks = scales::breaks_width(10),
expand = expansion(mult = 0, add = 2)
) +
scale_color_manual(
breaks = c(TRUE, FALSE),
values = c(c2, c6)
) +
scale_shape_manual(values = c(20, 4)) +
scale_alpha_manual(values = c(.5, 1)) +
labs(
title = mi_titulo,
x = "Concentración de **plomo** (partes por mil de millón, 10<sup>-9</sup>)",
caption = mi_caption
) +
ggthemes::theme_par(base_family = "ubuntu", base_size = 15) +
theme_sub_legend(position = "none") +
theme_sub_plot(
background = element_rect(fill = c4),
title = element_markdown(size = rel(1.8), face = "plain"),
margin = margin_auto(25),
caption = element_markdown(
color = c2,
hjust = .5,
size = rel(.9),
margin = margin(t = 20),
lineheight = 1.3
)
) +
theme_sub_axis_y(
text = element_blank(),
ticks = element_blank(),
title = element_blank()
) +
theme_sub_axis_x(title = element_markdown(size = rel(1.2))) +
theme_sub_strip(
background = element_blank(),
text = element_text(hjust = 0, size = rel(1.2))
)
```
Guardo.
```{r}
ggsave(
plot = g,
filename = "tidytuesday/2025/semana_44.png",
width = 30,
height = 30,
units = "cm"
)
```