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é
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