Carte historique de l'Europe

en langage R

Exemple de carte de l'Europe réalisée avec le logiciel R project

Il est possible de réaliser des cartes complexes avec le logiciel R project et grâce en particulier aux librairies (packages) maptools, rgdal et maps.

On peut ainsi réaliser cette carte annotée où les points sont proportionnels à des valeurs.

Carte reproduite avec l'autorisation de Alexandre Massé

Carte de l'Europe avec le logiciel R project

1. Charger la carte vectorielle du monde - cette carte est disponible ici (source du fichier vectoriel)

install.packages("maptools");install.packages("rgdal");install.packages("maps");

library("maptools");library(rgdal);library(maps)

setwd("C:/dossier/")

monde<- readOGR(dsn = ".", layer = "ne_50m_admin_0_countries_lakes", p4s=CRS("+proj=longlat"))

# ATTENTION : ce message d'erreur peut apparaître "Error in getinfo.shape(fn) : Error opening SHP file" ==> Cet erreur apparaît si dans # le dossier source il n'y a que le fichier .shp alors qu'il faut qu'il soit avec les autres fichiers du même nom disponible en téléchargement # à la source de la carte vectorielle indiquée ci-dessus.

le_monde <- spTransform(monde,CRS("+proj=longlat")) # intègre les valeurs de longueur et longitude

polym <- as(le_monde, "SpatialPolygons") # Conversion des pays en polygones

# optionnel : il est possible d'afficher un résumé bilan du fichier : summary(monde)

# optionnel : on peut aussi retrouver l'indice d'un pays :le_monde$name

# optionnel : on peut encore afficher l'indice d'un pays : which(le_monde$name=="Spain")

2. Préparer les données que l'on veut superposer à la carte : ici il s'agit de positionner des villes qui contiennent des correspondants et de l'indiquer par un point proportionnel au nombre de correspondants

# Noms des villes

villes =c("Alep","Athènes","Constantinople","Janina","La Canée","Malte","Marseille","Nauplie","Naxos","Paris","Patras","Smyrne","Syra","Toulon","Voiron")

# Nombre de correspondants par ville

correspondants = c(1,8,2,1,3,3,1,3,1,9,4,3,5,2,1)

# Coordonnées GPS de chaque ville

latitude = c(36.206989, 37.979540,41.009957,39.677171,35.512095,35.887603,43.296032, 37.568079,37.103533,48.856327, 38.246857, 38.416941, 37.423152, 43.121735,45.363004)

longitude = c(37.144465, 23.727611, 28.981832, 20.874717,24.018260, 14.446847,5.375414, 22.801421,25.377652,2.351394 ,21.739426,27.130239,24.916024, 5.931157,5.591721)

3. Préparer les données à superposer à la carte

# Création d'une variable contenant les rayons des cercles à représenter - rayon proportionnel au nombre de correspondants

rayons <- sqrt(correspondants/2/pi) #la somme des surfaces des cercles

# Tri des fichiers rayons, latitudes et longitudes (format dataframe) de manière à ce que les cercles soient dessinés du plus gros au plus petit

lat <- latitude[order(rayons, decreasing = TRUE)]

long <- longitude[order(rayons, decreasing = TRUE)]

ray <- rayons[order(rayons, decreasing = TRUE)]

4. Pour tracer la carte

# Définir les limites de la carte

xlim=c(0,32)

ylim=c(35,50)

# Tracer la carte

plot(polym,col=c("#FEE08B"),axes=T,xlim=xlim,ylim=ylim)

box()

5. Pour annoter la carte

# Tracer les disques rouges transparents

couleur =rgb(red=(243/255), green=(105/255), blue=0, alpha=0.8)

symbols(long,lat, circles = ray, add = TRUE, bg = couleur, inches = FALSE)

text(longitude,latitude,correspondants,cex=(rayons*1.5))

# Ajouter les noms des villes

longitude_ville =c(37.144465, 23.727611, 28.981832, 20.874717,24.018260, 14.446847,5.375414, 22.801421,25.377652,2.351394 ,21.739426,27.130239,24.916024, 5.931157,5.591721)

latitude_ville = c(36.206989, 37.979540,41.009957,39.677171,35.512095,35.887603,43.296032, 37.568079,37.103533,48.856327, 38.246857, 38.416941, 37.423152, 43.121735,45.363004)+rayons+0.05

latitude_ville[villes=="Paris"] = latitude_ville[villes=="Paris"]-0.15

latitude_ville[villes=="Patras"] = latitude_ville[villes=="Patras"]-0.15

latitude_ville[villes=="Athènes"] = latitude_ville[villes=="Athènes"]-0.15

latitude_ville[villes=="Syra"] = latitude_ville[villes=="Syra"]-0.15

latitude_ville[villes=="Naxos"] = latitude_ville[villes=="Naxos"]-0.8

longitude_ville[villes=="Naxos"] = longitude_ville[villes=="Naxos"]+0.5

latitude_ville[villes=="Nauplie"] = latitude_ville[villes=="Nauplie"]-1.3

longitude_ville[villes=="Nauplie"] = longitude_ville[villes=="Nauplie"]+0.1

longitude_ville[villes=="Marseille"] = longitude_ville[villes=="Marseille"]-0.5

longitude_ville[villes=="Toulon"] = longitude_ville[villes=="Toulon"]+0.5

text(longitude_ville,latitude_ville,villes,cex=0.6, adj = c(0.5, NA),font=2) #adj = 0.5 text centré - si font=5 en grec

6. Pour ajouter la légende

# Affichage de la légende (dessin) - EN CLIQUANT SUR LA CARTE LA OU ON VEUT L'AFFICHER

cat("Cliquer pour désigner l'emplacement où afficher la légende.\n")

l <- locator(n=1) #cliquer dans la fenêtre graphique à l’endroit choisi

xy <- matrix(c( l$x-5, l$y,

l$x+5, l$y,

l$x+5, l$y+2.5,

l$x-5, l$y+2.5), byrow=T, nc=2)

polygon(xy, border=T, col='white') # encadré blanc

rLeg <- quantile(rayons, c(1, 0.9, 0), type = 1, na.rm = TRUE)

rVal <- quantile(correspondants, c(1, 0.9, 0), type = 1, na.rm = TRUE)

x <- l$x

y <- l$y

r_min = min(rayons)

r_max = max(rayons)

c_min = min(correspondants)

c_max = max(correspondants)

x_pos = c(x,x)

a=1.3

y_pos = c((y+r_max/a),(y+r_min/a))

symbols(x = x_pos, y = y_pos, circles = c(r_max,r_min), add = TRUE, bg = couleur, inches = FALSE)

text(x = x_pos, y = y_pos, c(c_max,c_min), cex = c(r_max,r_min), srt = 0)

# Source de l'aide : http://wukan.ums-riate.fr/rencontres-r/scripts.html

text(x = x_pos, y = c(y+r_max+0.5), "Nombre de correspondants par ville\n", adj = c(0.5, 0), cex = 0.7)

#points(longitude,latitude ,col="red",pch=16)

7. Pour ajouter l'orientation

# Afficher l'orientation - EN CLIQUANT SUR LA CARTE LA OU ON VEUT L'AFFICHER

northarrow <- function(loc,size,bearing=0,cols,cex=1,...) {

# checking arguments

if(missing(loc)) stop("loc is missing")

if(missing(size)) stop("size is missing")

# default colors are white and black

if(missing(cols)) cols <- rep(c("white","black"),8)

# calculating coordinates of polygons

radii <- rep(size/c(1,4,2,4),4)

x <- radii[(0:15)+1]*cos((0:15)*pi/8+bearing)+loc[1]

y <- radii[(0:15)+1]*sin((0:15)*pi/8+bearing)+loc[2]

# drawing polygons

for (i in 1:15) {

x1 <- c(x[i],x[i+1],loc[1])

y1 <- c(y[i],y[i+1],loc[2])

polygon(x1,y1,col=cols[i])

}

# drawing the last polygon

poly gon(c(x[16],x[1],loc[1]),c(y[16],y[1],loc[2]),col=cols[16])

# drawing letters

b <- c("E","N","W","S")

for (i in 0:3) text((size+par("cxy")[1])*cos(bearing+i*pi/2)+loc[1],

(size+par("cxy")[2])*sin(bearing+i*pi/2)+loc[2],b[i+1],

cex=cex)

}

cat("Cliquer pour désigner l'emplacement de la rosace.\n")

l <- locator(n=1) #cliquer dans la fenêtre graphique à l’endroit choisi

northarrow(c(l$x,l$y),size=1)

8. Pour afficher l'échelle

# Afficher l'échelle - EN CLIQUANT SUR LA CARTE LA OU ON VEUT L'AFFICHER

scalebar <- function(loc,length,unit="km",division.cex=.8,...) {

if(missing(loc)) stop("loc is missing")

if(missing(length)) stop("length is missing")

length_km = length

length = (round(length/175*2*100))/100

x <- c(0,length/c(4,2,4/3,1),length*1.1)+loc[1]

y <- c(0,length/(10*3:1))+loc[2]

cols <- rep(c("black","white"),2)

for (i in 1:4) rect(x[i],y[1],x[i+1],y[2],col=cols[i])

for (i in 1:5) segments(x[i],y[2],x[i],y[3])

#length = length_km

#x <- c(0,length/c(4,2,4/3,1),length*1.1)+loc[1]

#y <- c(0,length/(10*3:1))+loc[2]

labels <- x[c(1,3)]-loc[1]

#labels <- append(labels,paste(length," ",unit))

labels = paste(length_km," ",unit)

cat(labels)

text(x[c(3)],y[4],labels=labels,adj=c(.5,0),cex=division.cex)

}

cat("Cliquer pour désigner l'emplacement de l'échelle.\n")

l = locator(n=1)

scalebar(c(l$x,l$y),200,division=1)

Mise à jour de la page juin 2019