(Acest articol a fost publicat pentru prima dată pe pacha.dev/blogși cu amabilitate a contribuit la R-bloggeri). (Puteți raporta problema legată de conținutul acestei pagini aici)
Doriți să vă distribuiți conținutul pe R-bloggeri? dați clic aici dacă aveți un blog, sau aici dacă nu aveți.
Dacă această postare vă este utilă, vă rog cu drag o donație minimă pe Buy Me a Coffee. Va fi folosit pentru a-mi continua eforturile Open Source.
Puteți să-mi trimiteți întrebări pentru blog folosind acest formular și să vă abonați pentru a primi un e-mail când apare o nouă postare.
Am primit această întrebare prost formulată pentru blog: „Vă rugăm să clarificați. Aceste două nu funcționează. Din care pachet este po_tooltip. Mulțumesc.”
Apreciez mulțumirile, dar amintiți-vă că mă ajutați să vă ajut să guvernați: „Vă rugăm să furnizați un exemplu minim, reproductibil când cereți ajutor.” Sau măcar explică despre ce este întrebarea ta.
Pe baza intrebarii, este din postarea Indexului Gini.
Voi încerca să explic prin crearea unei hărți a populației Londrei folosind pachetul D3po.
Toate po_*() funcțiile fac parte din pachetul D3po, inclusiv po_tooltip().
Încărcați aceste pachete R pentru a importa și manipula datele:
library(d3po) library(dplyr) library(sf) library(rvest) library(janitor)
Există o hartă cu rezoluție mai bună a cartierelor londoneze oferită de TfL. Această hartă arată mai bine în comparație cu harta subnațională oferită de D3po (rezoluție scăzută).
Descărcați fișierul GeoJSON pentru a arăta că D3po poate lucra cu orice date spațiale în sf format.
url <- "https://hub.arcgis.com/api/v3/datasets/0a92a355a8094e0eb20a7a66cf4ca7cf_10/downloads/data?format=geojson&spatialRefId=4326&where=1%3D1"
finp <- "~/Documents/blog-materials/2025/11/14/london-population/london_boroughs.geojson"
if (!file.exists(finp)) {
download.file(url, destfile = finp, mode = "wb")
}
Citiți fișierul GeoJSON folosind st_read() din sf ambalați și curățați numele coloanelor cu clean_names() din janitor pachet:
boroughs <- st_read(finp) %>% clean_names()
Reading layer `London_Boroughs' from data source `/home/pacha/Documents/blog-materials/2025/11/14/london-population/london_boroughs.geojson' using driver `GeoJSON' Simple feature collection with 33 features and 13 fields Geometry type: POLYGON Dimension: XY Bounding box: xmin: -0.5103558 ymin: 51.28676 xmax: 0.3340441 ymax: 51.69188 Geodetic CRS: WGS 84
boroughs
Simple feature collection with 33 features and 13 fields
Geometry type: POLYGON
Dimension: XY
Bounding box: xmin: -0.5103558 ymin: 51.28676 xmax: 0.3340441 ymax: 51.69188
Geodetic CRS: WGS 84
First 10 features:
borough number code hectares descript0 x
1 Bromley 19 00AF 15014.5152 CIVIL ADMINISTRATION AREA 542896
2 Lewisham 07 00AZ 3532.3405 CIVIL ADMINISTRATION AREA 537667
3 Wandsworth 10 00BJ 3522.0032 CIVIL ADMINISTRATION AREA 526129
4 Merton 22 00BA 3760.9196 CIVIL ADMINISTRATION AREA 525475
5 Redbridge 14 00BC 5645.0083 CIVIL ADMINISTRATION AREA 543914
6 Barnet 30 00AC 8673.7261 CIVIL ADMINISTRATION AREA 524028
7 City of London 00 00AA 315.2813 CIVIL ADMINISTRATION AREA 532464
8 Sutton 21 00BF 4385.0950 CIVIL ADMINISTRATION AREA 526976
9 Southwark 08 00BE 2989.7206 CIVIL ADMINISTRATION AREA 533855
10 Ealing 27 00AJ 5552.7807 CIVIL ADMINISTRATION AREA 515888
y area objectid file_name shape_area shape_length
1 165656 0 1 GREATER_LONDON_AUTHORITY 150145152 75909.143
2 174002 0 2 GREATER_LONDON_AUTHORITY 35323405 40992.749
3 174114 0 3 GREATER_LONDON_AUTHORITY 35220032 37353.847
4 169422 0 4 GREATER_LONDON_AUTHORITY 37609196 32293.920
5 189463 0 5 GREATER_LONDON_AUTHORITY 56450083 45688.184
6 192316 0 6 GREATER_LONDON_AUTHORITY 86737261 50866.472
7 181220 0 7 GREATER_LONDON_AUTHORITY 3152813 9651.891
8 164132 0 8 GREATER_LONDON_AUTHORITY 43850950 39753.841
9 176787 0 9 GREATER_LONDON_AUTHORITY 29897206 33664.416
10 181715 0 10 GREATER_LONDON_AUTHORITY 55527807 47268.052
global_id geometry
1 86b54395-dc20-4e52-bc8c-7b79188f035f POLYGON ((0.01215857 51.299...
2 84f88d72-30c1-47b6-bc71-163246413f0d POLYGON ((-0.04613459 51.45...
3 617038fb-5459-4133-96ae-1743ba48321c POLYGON ((-0.2540111 51.437...
4 6362d58b-7052-4655-a812-3487752e770e POLYGON ((-0.2181117 51.380...
5 3d6ac4f8-be2c-4a89-a684-e50e11c602e9 POLYGON ((0.02036894 51.556...
6 e424d66c-44fe-4e0e-b58b-d1851cfe71b1 POLYGON ((-0.1998716 51.670...
7 417f3ab6-bfb7-4770-827f-80526d360a25 POLYGON ((-0.1115267 51.515...
8 6dfcbe71-9609-488c-8852-df930b685ada POLYGON ((-0.1442461 51.339...
9 161208ac-2edc-471f-81dc-ec7e494032e5 POLYGON ((-0.07829781 51.42...
10 4d06499b-5d29-43e8-a4fa-c32be7b23119 POLYGON ((-0.3354244 51.496...
Extrageți numele districtului:
names1 <- pull(boroughs, borough) names1
(1) "Bromley" "Lewisham" "Wandsworth" (4) "Merton" "Redbridge" "Barnet" (7) "City of London" "Sutton" "Southwark" (10) "Ealing" "Brent" "Croydon" (13) "Richmond upon Thames" "Hillingdon" "Haringey" (16) "Kensington & Chelsea" "Kingston upon Thames" "Waltham Forest" (19) "Barking & Dagenham" "Newham" "Enfield" (22) "Hammersmith & Fulham" "Havering" "Greenwich" (25) "Hackney" "Westminster" "Camden" (28) "Tower Hamlets" "Hounslow" "Harrow" (31) "Bexley" "Islington" "Lambeth"
Acum avem nevoie de populație pentru cele 33 de cartiere. CityPopulation.DE are un tabel pe care îl putem citi folosind rvest:
url_pop <- "https://www.citypopulation.de/en/uk/greaterlondon/"
finp2 <- "~/Documents/blog-materials/2025/11/14/london-population/london_population.rds"
if (file.exists(finp2)) {
pop_table <- readRDS(finp2)
} else {
page <- read_html(url_pop)
tables <- page %>% html_nodes("table")
pop_table <- tables((1)) %>%
html_table() %>%
clean_names()
pop_table <- pop_table %>%
select(name, pop = population_estimate2024_06_30)
pop_table <- pop_table %>%
mutate(pop = as.numeric(gsub(",", "", pop)))
names2 <- pull(pop_table, name)
names2
# names that do not match
setdiff(names1, names2)
setdiff(names2, names1)
# replace the " and " with " & " in boroughs
# replace "City of Westminster" with "Westminster"
pop_table <- pop_table %>%
mutate(borough = case_when(
name == "City of Westminster" ~ "Westminster",
grepl(" and ", name) ~ gsub(" and ", " & ", name),
TRUE ~ name
)) %>%
select(-name)
saveRDS(pop_table, finp2)
}
Până în acest moment putem arăta două hărți:
- Locuitori pe cartier
- Locuitori pe km pătrat
boroughs <- boroughs %>%
left_join(pop_table, by = "borough") %>%
mutate(
area_km2 = hectares / 100,
pop_per_km2 = pop / area_km2
)
Definiți un gradient de culoare pentru hărți a și creați hărțile folosind d3po:
my_gradient <- c("#b2d8d8", "#66b2b2", "#008080", "#006666", "#004c4c")
d3po(boroughs, width = 800, height = 600) %>%
po_geomap(daes(group = borough, size = pop, color = my_gradient, gradient = T, tooltip = borough)) %>%
po_labels(
title = "Population in London Boroughs (2024)",
subtitle = "Source: CityPopulation.DE & TFL London Boroughs"
)
