Mappare il Sud America con R: un tuffo nel mondo della geovisualizzazione |  di Fernando Barbalho |  Agosto 2023

 | Intelligenza-Artificiale

Esplorare set di dati, sfumature geopolitiche e sfide di codifica per dipingere un quadro completo del continente

fotografato da Alexander Schimmeck SU Unsplash

COSÌ sei quel tipo di data scientist e scrittore amatoriale di Medium a cui sono piaciute le mappe e la geografia fin dall’infanzia. Stai cercando un buon tema per il tuo successivo lavoro con grafici e, sicuramente, mappe quando ti rendi conto che l’agenzia statistica ufficiale del tuo paese, il Brasile, ha pubblicato i dati del censimento più recenti. Perché no? Perché non scattare una foto del Brasile rispetto ai suoi vicini del Sud America? Potrebbe essere un compito semplice utilizzando R e tutti i suoi ottimi pacchetti. Facciamolo.

Un minuto dopo questa decisione arriva la consapevolezza che il compito semplice è davvero il viaggio di un eroe con elementi come la scoperta del set di dati più adatto con gli shapefile, la mancanza di informazioni, l’interoperabilità degli shapefile, la matematica di latitudine e longitudine, le differenze culturali nei concetti di geografia e persino i concetti geopolitici. questioni, come capire come inserire correttamente la mappa e i dati dei territori francesi d’oltremare in Sud America.

I paragrafi successivi spiegano uno dei possibili percorsi per dipingere le informazioni demografiche in una porzione delimitata di una mappa del mondo. La procedura descritta di seguito potrebbe essere utile per tutti coloro che sono interessati al confronto internazionale con un approccio di geovisualizzazione, anche se lo scopo è quello di confrontare l’accesso all’acqua tra i paesi africani o i tassi di obesità nel Nord America.

Cominciamo con il quadro completo: una versione R di mapa-mundi. Vedi l’immagine e il codice qui sotto.

Mapa Mundi: immagine dell’autore
library(readxl)
library(geobr)
library(tidyverse)
library(sf)
library(spData)
library(ggrepel)

data("world")

#mapa mundi

world %>%
ggplot() +
geom_sf(aes(fill=pop/10^6)) +
scale_fill_continuous_sequential(palette= "Heat 2" )+
theme_void() +
theme(
panel.background = element_rect(fill="#0077be")
) +
labs(
fill= str_wrap("População em milhões de habitantes", 10)
)

Io uso il pacchetto {spData} come riferimento per un dataframe con informazioni sulla geometria per gli shapefile dei territori in tutto il pianeta. La funzione aes utilizza le informazioni sulla popolazione per riempire le forme. Come sappiamo, Cina e India sono i paesi più popolati al mondo, con oltre 1 miliardo di persone ciascuno. I colori caldi mostrano il contrasto con tutti gli altri paesi. La maggior parte dei colori sequenziali sono deboli. Riusciamo a malapena a capire la sfumatura dei colori nell’immagine. Il logaritmo è l’alternativa migliore se vuoi intravedere una migliore distribuzione del colore. Vedi sotto.

Mapa mundi con scala logaritmica. Immagine dell’autore
world %>%
ggplot() +
geom_sf(aes(fill=pop)) +
scale_fill_continuous_sequential(palette= "Heat 2", trans= "log2" )+
theme_void() +
theme(
panel.background = element_rect(fill="#0077be"),
legend.position = "none"
)

Nel codice, puoi vedere la trasformazione del logaritmo nella funzione scale_fill_continuous_sequential.

Nella struttura del dataframe mondiale è presente una colonna Continente. Quindi, filtrare i dati utilizzando questa colonna per ottenere una mappa del Sud America è ovvio. Vedi il codice e, subito dopo, la mappa.

Mappa del Sud America: prima versione. Immagine dell’autore
world %>%
filter(continent == "South America") %>%
ggplot() +
geom_sf(aes(fill=pop/10^6)) +
scale_fill_continuous_sequential(palette= "Heat 2" )+
theme_void() +
theme(
panel.background = element_rect(fill="#0077be")
) +
labs(
fill= str_wrap("População em milhões de habitantes", 10)
)

Come puoi vedere, la funzione del filtro dplyr ha funzionato bene; questa è proprio la mappa che volevamo vedere. Ma è davvero corretto?

Il cambiamento climatico è un problema enorme, ma il livello del mare non si è ancora alzato in misura tale da sommergere un’area pronunciata che prima appariva nel Nord del Sud America. Cos’è successo qua? Disegniamo ora un’altra mappa con l’aiuto delle coordinate e nominando i poligoni.

Mappa del Sud America: seconda versione. Immagine dell’autore
southamerica<-
world %>%
filter(continent=="South America")

southamerica$lon<- sf::st_coordinates(sf::st_centroid(southamerica$geom))(,1)
southamerica$lat<- sf::st_coordinates(sf::st_centroid(southamerica$geom))(,2)

southamerica %>%
ggplot() +
geom_sf(aes(fill=pop/10^6)) +
scale_fill_continuous_sequential(palette= "Heat 2" )+
theme_light() +
theme(
panel.background = element_rect(fill="#0077be")
) +
labs(
fill= str_wrap("População em milhões de habitantes", 10)
)+
geom_text_repel(aes(x=lon, y=lat, label= str_wrap(name_long,20)),
color = "black",
fontface = "bold",
size = 2.8)

Theme_light invece di theme_void era sufficiente per visualizzare le coordinate. La denominazione dei poligoni ha richiesto più lavoro. Abbiamo dovuto calcolare il centroide di ciascun poligono e quindi utilizzare queste informazioni come coordinate xey in una funzione geom_text_repel.

Con questa nuova versione della mappa e alcune conoscenze precedenti, abbiamo scoperto che il territorio mancante era la Guyana francese, tra 0º e 10º di latitudine nord e 53º e 55º di longitudine ovest. La nostra prossima missione è capire come ottenere informazioni sulla Guyana francese: poligono, popolazione e alcune coordinate per riempire la nostra mappa.

Ho dovuto isolare la Francia dal resto del mondo per capire come il pacchetto {spData} gestiva i dati della mappa di questo paese. Vedi il risultato qui sotto.

Una mappa della Francia. Immagine dell’autore
france<-
world %>%
filter(iso_a2 == "FR")

france %>%
ggplot() +
geom_sf(aes(fill=pop)) +
scale_fill_continuous_sequential(palette= "Heat 2", trans= "log2" )+
theme_light() +
theme(
#panel.background = element_rect(fill="#0077be")
) +
labs(
fill= str_wrap("População", 30)
)

La Francia ha molti cosiddetti territori d’oltremare. L’approccio del {spData} Il pacchetto doveva rappresentare solo il territorio principale, più la Corsica, un’isola nel Mar Mediterraneo, e la Guyana francese, situata esattamente nell’intervallo di coordinate che caratterizza il divario nella nostra ultima mappa del Sud America.

Il mio tentativo successivo è stato quello di aggiungere il dataframe con i dati della geometria della Francia al mio filtro del Sud America, ma sapevo che ne avrei avuto bisogno di più. Vedi sotto

Sud America + Francia. Immagine dell’autore
southamerica %>%
bind_rows(france) %>%
ggplot() +
geom_sf(aes(fill=pop/10^6)) +
scale_fill_continuous_sequential(palette= "Heat 2" )+
theme_light() +
theme(
panel.background = element_rect(fill="#0077be")
) +
labs(
fill= str_wrap("População em milhões de habitantes", 10)
)+
geom_text_repel(aes(x=lon, y=lat, label= str_wrap(name_long,20)),
color = "black",
fontface = "bold",
size = 2.8)

Come puoi vedere nel codice, ho usato bind_row per combinare i territori del Sud America con lo shapefile della Francia. Quindi ora avevamo la Guyana francese ben posizionata. D’altra parte, non ci sono informazioni sulla popolazione sulla mappa e la Francia fa parte del Sud America all’inverso della storia del colonialismo.

In altre parole, volevo questa mappa.

La Guyana francese si trova sulla mappa del Sud America. Immagine dell’autore
data_guiana<-
insee::get_idbank_list('TCRED-ESTIMATIONS-POPULATION') %>%
filter(str_detect(REF_AREA_label_fr,"Guyane")) %>%
filter(AGE == "00-") %>% #all ages
filter(SEXE == 0) %>% #men and women
pull(idbank) %>%
insee::get_insee_idbank() %>%
filter(TIME_PERIOD == "2023") %>%
select(TITLE_EN,OBS_VALUE) %>%
mutate(iso_a2 = "FR")

data_guiana <- janitor::clean_names(data_guiana)

southamerica %>%
bind_rows(france) %>%
left_join(data_guiana) %>%
mutate(pop=ifelse(iso_a2=="FR",obs_value,pop))%>%
mutate(lon= ifelse(iso_a2=="FR", france((11))((1))((1))((1))(1,1), lon),
lat= ifelse(iso_a2=="FR",france((11))((1))((1))((1))(1,2), lat)) %>%
ggplot() +
geom_sf(aes(fill=pop/10^6)) +
scale_fill_continuous_sequential(palette= "Heat 2" )+
geom_text_repel(aes(x=lon, y=lat, label= str_wrap(name_long,20)),
color = "black",
fontface = "bold",
size = 2.8)+
coord_sf(xlim = c(-82,-35), ylim=c(-60,15))+
theme_light() +
theme(
panel.background = element_rect(fill="#0077be")
) +
labs(
fill= str_wrap("População em milhões de habitantes", 10)
)

Come puoi leggere, ho usato un Pacchetto R prodotto dall’ufficio statistico ufficiale francese per ottenere la popolazione della Guyana. Inoltre, ho limitato la mappa alle coordinate appropriate per vedere il Sud America.

Ora che l’eroe della mappa ha finalmente risolto i problemi sudamericani e ha giocato tubi di pace con la Francia, è tempo di tornare ai dati e alle mappe brasiliane. Ricorda, voglio confrontare alcuni dettagli del censimento brasiliano con altri paesi e territori a sud di Panama.

I dati del censimento sono disponibili in an Pacchetto R o ad un API indirizzo. Ho eseguito l’opzione più impegnativa utilizzando l’API. Usare l’altra opzione un’altra volta potrebbe essere una buona idea. Vedi il codice e la mappa qui sotto, dove mostro la popolazione degli stati brasiliani in contrasto con gli altri territori sudamericani.

Sud America + Stati brasiliani. Immagine dell’autore
central_america<-
world %>%
filter(subregion == "Central America")

brasil<- geobr::read_country()
estados<- geobr::read_state()

#dados de população

ibge2022<-
get_municipalies_data()

estados<-
estados %>%
inner_join(
ibge2022 %>%
rename(abbrev_state = uf) %>%
summarise(.by=abbrev_state,
pop = sum(populacao_residente)
)
)

southamerica %>%
filter(iso_a2!="BR") %>%
bind_rows(france) %>%
left_join(data_guiana) %>%
mutate(pop=ifelse(iso_a2=="FR",obs_value,pop))%>%
mutate(lon= ifelse(iso_a2=="FR", france((11))((1))((1))((1))(1,1), lon),
lat= ifelse(iso_a2=="FR",france((11))((1))((1))((1))(1,2), lat)) %>%
ggplot() +
geom_sf(aes(fill=pop/10^6)) +
geom_sf(data=estados, aes(fill=pop/10^6)) +
geom_sf(data=brasil,fill=NA, color="#00A859", lwd=1.2)+
geom_sf(data= central_america,fill= "#808080")+
scale_fill_continuous_sequential(palette= "Heat 2" )+
geom_text_repel(aes(x=lon, y=lat,
label= str_wrap(name_long,20)),
color = "black",
fontface = "bold",
size = 2.8)+
coord_sf(xlim = c(-82,-35), ylim=c(-60,15))+
theme_void() +
theme(
panel.background = element_rect(fill="#0077be")
) +
labs(
fill= str_wrap("População em milhões", 10)
)

Ho scritto la funzione get_municipalites_data utilizzando l’API sopra citata. Il codice è disponibile nel mio sostanza. Nota anche due funzioni che forniscono gli shapefile utilizzati per disegnare i limiti del Brasile e delle sue sottoregioni: read_country e read_states. Queste funzioni sono presenti nel {geobr} pacchetto.

Ho usato un altro filtro dal dataframe mondiale. In questo caso, lo scopo è mostrare l’inizio del subcontinente centroamericano e dipingere la sua mappa con una sfumatura di grigio. In questo caso, abbiamo dovuto affrontare una divergenza culturale poiché in Brasile abbiamo appreso che le Americhe hanno tre subcontinenti: Nord America, America Centrale e Sud America. Per gli autori del set di dati, l’America Centrale è una sottoregione del Nord America.

Ora è il momento di finire il mio lavoro. Voglio mostrare i nomi degli otto territori più popolosi sulla mappa. Anche in questo sprint finale ci sono stati alcuni trucchi nel codice.

Territori più popolati. Immagine dell’autore
estados$lon<- sf::st_coordinates(sf::st_centroid(estados$geom))(,1)   
estados$lat<- sf::st_coordinates(sf::st_centroid(estados$geom))(,2)

most_populated<-
southamerica %>%
filter(iso_a2 !="BR") %>%
rename(name= name_long) %>%
as_tibble() %>%
select(name, pop, lat, lon) %>%

bind_rows(
estados %>%
rename(name= name_state) %>%
as_tibble() %>%
select(name, pop, lat, lon)
) %>%
slice_max(order_by = pop, n=8)

southamerica %>%
filter(iso_a2!="BR") %>%
bind_rows(france) %>%
left_join(data_guiana) %>%
mutate(pop=ifelse(iso_a2=="FR",obs_value,pop))%>%
mutate(lon= ifelse(iso_a2=="FR", france((11))((1))((1))((1))(1,1), lon),
lat= ifelse(iso_a2=="FR",france((11))((1))((1))((1))(1,2), lat)) %>%
ggplot() +
geom_sf(aes(fill=pop/10^6)) +
geom_sf(data=estados, aes(fill=pop/10^6)) +
geom_sf(data=brasil,fill=NA, color="#00A859", lwd=1.2)+
geom_sf(data= central_america,fill= "#808080")+
scale_fill_continuous_sequential(palette= "Heat 2" )+
geom_text_repel(data= most_populated,
aes(x=lon, y=lat,
label= str_c(str_wrap(name,10),": ",round(pop/10^6,1))),
color = "black",
fontface = "bold",
size = 2.9)+
coord_sf(xlim = c(-82,-35), ylim=c(-60,15))+
theme_void() +
theme(
panel.background = element_rect(fill="#0077be")
) +
labs(
fill= str_wrap("População em milhões", 10)
)

Tre stati brasiliani sono tra gli otto territori più popolati del Sud America. San Paolo, infatti, è il secondo spazio più abitato sulla mappa, superando tutti i paesi tranne la Colombia.

Ora, concentrandoti sul codice, puoi vedere che ho creato un nuovo dataframe per costruire questa classifica combinando due diversi oggetti sf. Ho selezionato un sottoinsieme di colonne e ho modificato il tipo da sf a tibble per abilitare l’associazione delle righe.

Quindi è questo. L’eroe ha completato un possibile percorso e ha lasciato le impronte per il prossimo viaggio. Ora è il tuo turno. Ricorda tutti i tuoi progetti che potrebbero avere un miglioramento significativo utilizzando una rappresentazione cartografica. Utilizzando la procedura descritta sopra e raccogliendo tutti i dati disponibili sulla popolazione, sulle questioni socioeconomiche e così via, è solo questione di scegliere la variabile per riempire i poligoni.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *