Cartographie de l’Amérique du Sud avec R Une plongée profonde dans la géo-visualisation

Cartographie de l'Amérique du Sud avec R plongée dans la géo-visualisation

Photo de Alexander Schimmeck sur Unsplash

Donc, vous êtes ce genre de data scientist et écrivain amateur VoAGI qui apprécie les cartes et la géographie depuis l’enfance. Vous recherchez un bon thème pour votre prochain travail avec les graphiques et, bien sûr, les cartes lorsque vous réalisez que l’agence officielle des statistiques de votre pays, le Brésil, a publié les données les plus récentes du recensement. Pourquoi pas? Pourquoi ne pas prendre une photo du Brésil comparé à ses voisins en Amérique du Sud? Cela pourrait être une tâche simple en utilisant R et tous ses bons packages. Faisons-le.

La minute qui suit cette décision, vous réalisez que la tâche simple est en réalité un voyage héroïque avec des éléments tels que la découverte de l’ensemble de données le plus adapté avec des shapefiles, le manque d’informations, l’interopérabilité des shapefiles, les mathématiques de la latitude et de la longitude, les différences culturelles dans les concepts de géographie, et même des problèmes géopolitiques, comme comprendre comment placer correctement la carte et les données des territoires d’outre-mer français en Amérique du Sud.

Les paragraphes suivants expliquent l’un des chemins possibles pour représenter les informations démographiques dans une portion délimitée d’une carte du monde. Les étapes décrites ci-dessous peuvent être utiles pour tous ceux qui s’intéressent à la comparaison internationale avec une approche de géovisualisation, même si l’objectif est de comparer l’accès à l’eau entre les pays africains ou les taux d’obésité en Amérique du Nord.

Pachamama

Commençons par l’image globale : une version R du mapa-mundi. Voyez l’image et le code ci-dessous.

Mapa Mundi : Image de l'auteur
library(readxl)library(geobr)library(tidyverse)library(sf)library(spData)library(ggrepel)data("world")#mapa mundiworld %>%  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)  )

J’utilise le package {spData} comme référence pour un dataframe avec des informations géométriques pour les shapefiles des territoires partout sur la planète. La fonction aes utilise les informations de population pour remplir les formes. Comme nous le savons, la Chine et l’Inde sont les pays les plus peuplés du monde, avec plus d’un milliard de personnes chacun. Les couleurs chaudes montrent le contraste avec tous les autres pays. La plupart des couleurs séquentielles sont faibles. Nous pouvons à peine comprendre le dégradé de couleurs sur l’image. Le logarithme est la meilleure alternative si vous voulez avoir un aperçu d’une meilleure répartition des couleurs. Voir ci-dessous.

Mapa mundi avec échelle logarithmique. Image de l'auteur
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"  )

Dans le code, vous pouvez voir la transformation logarithmique dans la fonction scale_fill_continuous_sequential.

Dans la structure du dataframe world, il y a une colonne Continent. Donc, filtrer les données en utilisant cette colonne pour obtenir une carte de l’Amérique du Sud est évident. Voir le code et, juste après, la carte.

Carte de l'Amérique du Sud : première version. Image de l'auteur
world %>%  filter(continent == "Amérique du Sud") %>%  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)  )

Comme vous pouvez le voir, la fonction de filtrage dplyr a fonctionné correctement ; c’est juste la carte que nous voulions voir. Mais est-ce vraiment correct ?

Le changement climatique est un problème énorme, mais les niveaux de la mer n’ont pas encore augmenté avec un volume suffisant pour submerger une zone prononcée qui apparaissait autrefois au nord de l’Amérique du Sud. Que s’est-il passé ici ? Dessinons maintenant une autre carte à l’aide de coordonnées et en nommant les polygones.

Carte de l'Amérique du Sud : deuxième version. Image par auteur
southamerica<-  world %>%  filter(continent=="Amérique du Sud") 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)

Le thème theme_light au lieu de theme_void était suffisant pour afficher les coordonnées. La désignation des polygones a nécessité plus de travail. Nous avons dû calculer le centroïde de chaque polygone, puis utiliser ces informations comme coordonnées x et y dans une fonction geom_text_repel.

Avec cette nouvelle version de la carte et quelques connaissances préalables, nous avons découvert que le territoire manquant était la Guyane française, entre 0º et 10º de latitude nord et entre 53º et 55º de longitude ouest. Notre prochaine quête consiste à comprendre comment obtenir des informations sur la Guyane française : le polygone, la population et quelques coordonnées pour remplir notre carte.

La Mer

J’ai dû isoler la France du reste du monde pour comprendre comment le package {spData} traitait les données de la carte de ce pays. Voici le résultat ci-dessous.

Une carte de la France. Image par auteur
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 France a de nombreux territoires d’outre-mer. L’approche du package {spData} a été de représenter uniquement le territoire principal, ainsi que la Corse, une île en mer Méditerranée, et la Guyane française, située précisément dans la plage de coordonnées qui caractérise le manque dans notre dernière carte de l’Amérique du Sud.

Ma prochaine tentative a été d’ajouter le dataframe avec les données géométriques de la France à mon filtre de l’Amérique du Sud, mais je savais que j’aurais besoin de plus. Voir ci-dessous

Amérique du Sud + France. Image par auteur
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)

Comme vous pouvez le voir dans le code, j’ai utilisé bind_rows pour combiner les territoires d’Amérique du Sud avec la shapefile de la France. Ainsi, nous avons maintenant la Guyane française bien positionnée. D’un autre côté, il n’y a pas d’information sur la population sur la carte, et la France fait partie de l’Amérique du Sud à l’envers de l’histoire du colonialisme.

En d’autres termes, je voulais cette carte.

La Guyane française est sur la carte de l'Amérique du Sud. Image de l'auteur
data_guiana<- insee::get_idbank_list('TCRED-ESTIMATIONS-POPULATION') %>% filter(str_detect(REF_AREA_label_fr,"Guyane")) %>% filter(AGE == "00-") %>% filter(SEXE == 0) %>% 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))

Comme vous pouvez le lire, j’ai utilisé un package R produit par l’office des statistiques officielles de la France pour obtenir la population de la Guyane. De plus, j’ai limité la carte aux coordonnées appropriées pour voir l’Amérique du Sud.

Emolduram e aquarelam o meu Brasil

Maintenant que le héros de la carte a enfin résolu les problèmes sud-américains et a joué les notes de la paix avec la France, il est temps de revenir aux données et cartes brésiliennes. Rappelez-vous, je veux comparer certains détails du recensement brésilien avec d’autres pays et territoires au sud du Panama.

Le recensement des données est disponible dans un package R ou à une adresse API. J’ai choisi l’option plus difficile en utilisant l’API. Utiliser l’autre option une autre fois pourrait être une bonne idée. Voyez le code et la carte ci-dessous, où je montre la population des États brésiliens en contraste avec les autres territoires d’Amérique du Sud.

Amérique du Sud + États brésiliens. Image de l'auteur
central_america<-  monde %>%  filter(sous_region == "Amérique centrale")brasil<- geobr::read_country()estados<- geobr::read_state()#données de populationibge2022<-  get_municipalies_data()estados<-  estados %>%  inner_join(    ibge2022 %>%      rename(abbrev_state = uf) %>%      summarise(.by=abbrev_state,                pop = sum(population_résidente)      )  )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("Population en millions", 10)  )

J’ai écrit la fonction get_municipalites_data en utilisant l’API mentionnée ci-dessus. Le code est disponible dans mon gist. Notez également deux fonctions qui fournissent les fichiers de formes utilisés pour dessiner les limites brésiliennes et de sa sous-région : read_country et read_states. Ces fonctions sont présentes dans le package {geobr}.

J’ai utilisé un autre filtre à partir du dataframe monde. Dans ce cas, le but est de montrer le début du sous-continent de l’Amérique centrale et de colorier sa carte avec une nuance de gris. Ici, nous avons fait face à une divergence culturelle car nous avons appris au Brésil que les Amériques ont trois sous-continents : l’Amérique du Nord, l’Amérique centrale et l’Amérique du Sud. Pour les auteurs de l’ensemble de données, l’Amérique centrale est une sous-région de l’Amérique du Nord. Maintenant, il est temps de terminer mon travail. Je veux montrer les noms des huit territoires les plus peuplés sur la carte. Même dans cette dernière ligne droite, il y a eu quelques astuces de code.

Territoires les plus peuplés. Image de l'auteur
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("Population en millions", 10)  )

Trois États brésiliens font partie des huit territoires les plus peuplés d’Amérique du Sud. En fait, São Paulo est le deuxième espace le plus habité sur la carte, dépassant tous les pays sauf la Colombie.

Maintenant, en se concentrant sur le code, vous pouvez voir que j’ai créé un nouveau dataframe pour construire ce classement en combinant deux objets sf différents. J’ai sélectionné un sous-ensemble de colonnes et j’ai changé le type de sf en tibble pour permettre la liaison des lignes.

Voilà, le héros a terminé un chemin possible et a laissé des traces pour le prochain voyage. Maintenant, c’est à votre tour. Souvenez-vous de tous vos projets qui pourraient bénéficier d’une amélioration significative en utilisant une représentation cartographique. En suivant les étapes ci-dessus et en rassemblant toutes les données disponibles sur la population, les problèmes socio-économiques, etc., il suffit de choisir la variable pour remplir les polygones.

Code et données

Le code complet est disponible sur gist.

Tous les ensembles de données brésiliens sont caractérisés comme appartenant au domaine public, car ce sont des données produites par des institutions gouvernementales fédérales, mises à disposition sur Internet dans le cadre de la transparence active et soumises à la Loi brésilienne sur l’accès à l’information.

IBGE : Données du recensement brésilien

IPEA : Shapefiles brésiliens

Les données françaises sont disponibles sur le portail Open Data et sont répertoriées sous la licence ouverte, ce qui permet d’explorer les informations à des fins commerciales.

We will continue to update IPGirl; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

AI

Construction et déploiement de modèles de CV Retours d'expérience d'un ingénieur en vision par ordinateur

Avec plus de 3 ans d'expérience dans la conception, la construction et le déploiement de modèles de vision par ordina...

AI

Entreprise technologique alimentée par l'IA aide les épiceries à démarrer à neuf dans la gestion de la chaîne d'approvisionnement

Parlons de s’attaquer aux fruits à portée de main. Afresh est une start-up d’IA qui aide les épiceries et...

AI

Équilibrer l'innovation et la durabilité une approche pragmatique de la responsabilité environnementale dans l'apprentissage approfondi pour la pathologie

Cette recherche se penche sur une préoccupation pressante dans le domaine de la pathologie – les émissions sign...

AI

Une méthode plus simple pour apprendre à contrôler un robot

Les chercheurs développent une technique d'apprentissage automatique qui peut apprendre efficacement à contrôler un r...

AI

Déverrouillage de la transparence de l'IA Comment le regroupement des fonctionnalités d'Anthropic améliore l'interprétabilité des réseaux neuronaux.

Dans un article récent intitulé “Vers la monosémioté: décomposition des modèles linguistiques avec l’appr...