Show code
# Note: statuesnamedjohn not loaded - vignette uses pre-computed targets objects
# devtools::load_all() # Uncomment if package functions are needed
library(dplyr)
library(ggplot2)
library(sf)
library(targets)
library(leaflet)In England’s grand capital, dear, More Johns than dames, it appears. For each woman of might, A John’s in plain sight, Confirming our gendered-statue fears.
This vignette compares and contrasts memorials in London honoring three distinct groups:
Data Sources: * Wikidata: Structured data for statues and public art in London. * OpenStreetMap: Crowdsourced data for memorials and statues.
We use the targets package to manage the data pipeline.
# Note: statuesnamedjohn not loaded - vignette uses pre-computed targets objects
# devtools::load_all() # Uncomment if package functions are needed
library(dplyr)
library(ggplot2)
library(sf)
library(targets)
library(leaflet)# Load data from targets pipeline
# We assume targets::tar_make() has been run previously
if (dir.exists(file.path(rprojroot::find_root(rprojroot::is_r_package), "_targets"))) {
# Set path to project root
tar_config_set(store = file.path(rprojroot::find_root(rprojroot::is_r_package), "_targets"))
all_memorials <- targets::tar_read(all_memorials, store = "_targets")
summary_table <- targets::tar_read(summary_table, store = "_targets")
findings <- targets::tar_read(findings, store = "_targets")
category_plot <- targets::tar_read(category_plot, store = "_targets")
memorial_map_plot <- targets::tar_read(memorial_map_plot, store = "_targets")
johns_comparison <- targets::tar_read(johns_comparison, store = "_targets")
memorial_interactive_map <- targets::tar_read(memorial_interactive_map, store = "_targets")
gender_analysis <- targets::tar_read(gender_analysis, store = "_targets")
} else {
message("Targets pipeline store not found. Please run targets::tar_make() to generate data.")
# Create dummy data for rendering if pipeline not run
all_memorials <- data.frame()
summary_table <- data.frame()
findings <- data.frame()
category_plot <- ggplot()
memorial_map_plot <- ggplot()
johns_comparison <- list(message = "Pipeline not run", claim_validated = FALSE, john_statues = 0, john_percent = 0, woman_statues = 0, woman_percent = 0)
memorial_interactive_map <- leaflet()
gender_analysis <- list(top_names_by_gender = data.frame())
}knitr::kable(summary_table,
caption = "Gender Representation Summary")| inferred_gender | n | percent |
|---|---|---|
| Unknown | 1409 | 68.3 |
| Male | 562 | 27.2 |
| Female | 91 | 4.4 |
| Animal | 1 | 0.0 |
| Other | 1 | 0.0 |
We extracted the first names from the memorials to identify the most common names for each gender group.
top_names_f <- gender_analysis$top_names_by_gender %>%
dplyr::filter(inferred_gender == "Female") %>%
dplyr::select(Name = extracted_names, Count = n, Percent = percent) %>%
dplyr::arrange(desc(Count))
knitr::kable(top_names_f, caption = "Most Common Female Names")| Name | Count | Percent |
|---|---|---|
| Mary | 14 | 14.9 |
| Margaret | 6 | 6.4 |
| Marie | 6 | 6.4 |
| Edith | 5 | 5.3 |
| Elizabeth | 4 | 4.3 |
top_names_m <- gender_analysis$top_names_by_gender %>%
dplyr::filter(inferred_gender == "Male") %>%
dplyr::select(Name = extracted_names, Count = n, Percent = percent) %>%
dplyr::arrange(desc(Count))
knitr::kable(top_names_m, caption = "Most Common Male Names")| Name | Count | Percent |
|---|---|---|
| John | 69 | 11.8 |
| George | 52 | 8.9 |
| William | 52 | 8.9 |
| Charles | 41 | 7.0 |
| Thomas | 30 | 5.1 |
category_plot
We can map the location of these memorials to see spatial patterns.
Explore the memorials interactively. Click clusters to zoom in, and click markers to see details.
memorial_interactive_mapThe campaign Statues for Equality claims that: * “The percentage of women’s statues in the UK that aren’t mythical or royal is approximately 3%” * “More statues of men named John dotted around the country than of women!”
Our analysis of London-specific data finds:
Validation: The claim that there are “more statues of men named John than of women” is refuted by our current London dataset.
(Note: Percentages are relative to the total dataset of queried memorials).
sessionInfo()
#> R version 4.5.2 (2025-10-31)
#> Platform: aarch64-apple-darwin24.6.0
#> Running under: macOS Sequoia 15.7.1
#>
#> Matrix products: default
#> BLAS: /nix/store/jammm5gz621n7dkzfzc1c43gs6xv9a10-blas-3/lib/libblas.dylib
#> LAPACK: /nix/store/30ypx3jnyq4r1z4nv742j1csfflsd66v-openblas-0.3.30/lib/libopenblasp-r0.3.30.dylib; LAPACK version 3.12.0
#>
#> locale:
#> [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
#>
#> time zone: UTC
#> tzcode source: internal
#>
#> attached base packages:
#> [1] stats graphics grDevices utils datasets methods base
#>
#> other attached packages:
#> [1] leaflet_2.2.3 targets_1.11.4 sf_1.0-21 ggplot2_4.0.0 dplyr_1.1.4
#>
#> loaded via a namespace (and not attached):
#> [1] generics_0.1.4 class_7.3-23 KernSmooth_2.23-26 digest_0.6.37
#> [5] magrittr_2.0.4 evaluate_1.0.5 grid_4.5.2 RColorBrewer_1.1-3
#> [9] fastmap_1.2.0 rprojroot_2.1.1 jsonlite_2.0.0 processx_3.8.6
#> [13] e1071_1.7-16 backports_1.5.0 secretbase_1.0.5 DBI_1.2.3
#> [17] ps_1.9.1 purrr_1.1.0 crosstalk_1.2.2 scales_1.4.0
#> [21] codetools_0.2-20 cli_3.6.5 rlang_1.1.6 units_1.0-0
#> [25] bit64_4.6.0-1 withr_3.0.2 yaml_2.3.10 tools_4.5.2
#> [29] base64url_1.4 assertthat_0.2.1 vctrs_0.6.5 R6_2.6.1
#> [33] proxy_0.4-27 lifecycle_1.0.4 classInt_0.4-11 bit_4.6.0
#> [37] htmlwidgets_1.6.4 arrow_20.0.0 pkgconfig_2.0.3 callr_3.7.6
#> [41] pillar_1.11.1 gtable_0.3.6 glue_1.8.0 data.table_1.17.8
#> [45] Rcpp_1.1.0 xfun_0.54 tibble_3.3.0 tidyselect_1.2.1
#> [49] knitr_1.50 farver_2.1.2 htmltools_0.5.8.1 igraph_2.2.1
#> [53] labeling_0.4.3 rmarkdown_2.30 compiler_4.5.2 prettyunits_1.2.0
#> [57] S7_0.2.0