Crearea unei hărți a populației Londrei cu D3po

URMĂREȘTE-NE
16,065FaniÎmi place
1,142CititoriConectați-vă

(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:

  1. Locuitori pe cartier
  2. 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"
  )
Dominic Botezariu
Dominic Botezariuhttps://www.noobz.ro/
Creator de site și redactor-șef.

Cele mai noi știri

Pe același subiect

LĂSAȚI UN MESAJ

Vă rugăm să introduceți comentariul dvs.!
Introduceți aici numele dvs.