Ocultar código
library(glue)
library(ggtext)
library(showtext)
library(tidyverse)Sitio en construcción
Víctor Gauto
2 de abril de 2026
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"
)
```