#1 Thu 27 November 2014 17:20
- Anaïs Just
- Participant actif
- Lieu: Montreuil
- Date d'inscription: 10 Dec 2007
- Messages: 131
[R] Représentation cartographique
Bonjour à tous,
même après avoir lu la documentation qui est recommandée ici je me heurte à un problème de représentation cartographique sous R.
J'ai compris comment attribuer des couleurs à une carte de façon aléatoire sur des attributs quantitatifs mais je n'ai pas trouvé comment attribuer une couleur en fonction d'un attribut qualitatif et surtout préciser: pour l'attribut A ->rouge, B->VERT, C-> JAUNE etc.
Je cherche a attribuer une note par région administrative (régions françaises) pour une espèce donnée.
Dans l'exemple ci dessous je peux avoir:
pour l'espèce A une table avec seulement deux notes: 4 et 5 donc en théorie les couleurs green et light green (pas de note 1,2 ou 3 pour cette espèce)
Pour l'espèce B une table avec 4 notes: 1,2,3,5 (donc 4 couleurs)
Le problème c'est que je souhaiterais lui définir une fois pour toute quelle couleur correspond à quelle note.
Avec mon code actuel R attribue les couleurs au hasard des premières notes qu'il rencontre.
pour l'espèce A je me retrouve avec du red et du orange...
Auriez-vous une idée de comment procéder?
(j'utilise maptools)
Code:
couleurs<- c("green","light green","yellow","orange", "red", "grey") legende<-c("5","4","3","2","1","non estimable") x<-plot(region, col=couleurs[as.numeric(region@data$note_finale)], border = "dark grey") title(main=Titre) legend("bottomleft",legend =legende,fill=couleurs,border = "dark grey",title = "Occurences",bty = "n")
Hors ligne
#2 Thu 27 November 2014 19:21
- RobinC
- Participant occasionnel
- Date d'inscription: 9 Jan 2008
- Messages: 37
Re: [R] Représentation cartographique
Bonjour,
Quel est le type de note_finale ?
Pouvez-vous afficher ici la sortie de str(region@data$note_finale) ?
Il se peut que ce soit un facteur, auquel cas, il faudra faire une conversion autre que as.numeric()
Hors ligne
#3 Fri 28 November 2014 09:52
- Anaïs Just
- Participant actif
- Lieu: Montreuil
- Date d'inscription: 10 Dec 2007
- Messages: 131
Re: [R] Représentation cartographique
Bonjour,
Merci pour ta réponse.
Note finale est de type string à la base
Code:
str(region@data$note_finale) chr [1:22] NA NA NA NA "5" NA "5" "4" NA "5" "5" ...
Du coup j'ai réussi à faire quelque chose en bidouillant (je passe par des break) mais je ne trouve pas ça propre et ça ne me satisfait pas tout à fait: comment faire si j'ai de vrais attributs qualitatif de type "bon","moyen",... sans avoir a transformer ça en valeurs numériques. Ce devrait être faisable simplement?
L'autre problème c'est qu'il y a bien le bon nombre de régions colorées, les bonnes notes...
Mais...-alors que ma jointure entre mon shapefile des régions et mes données fonctionne bien (pas de décalage)- les notes sur la carte finale ne sont pas du tout attribuées aux bonnes régions et je me demande si ce n'est pas du aux N.A (que maptools ne prendrais pas en compte provoquant un décalage)
Elles devraient être attribuées aux régions suivantes sur la carte BOURGOGNE, CENTRE, CHAMPAGNE-ARDENNE, FRANCHE-COMTE, HAUTE-NORMANDIE, ILE-DE-FRANCE, NORD-PAS-DE-CALAIS, PICARDIE et si on regarde la carte ce n'est pas du tout le cas...
[img]http://imageshack.com/a/img910/7830/jUqEIB.jpg[/img]
Code:
region <-readShapePoly("F:\\regions_metropole.shp" ) requete<- "SELECT * from qualification_repartition_rarete_all where cd_ref_demande='79734' order by nom_region asc" colnames(region@data) espece <- dbGetQuery(con, requete);espece nom_espece <- "Acer campestre L., 1753" region@data <- merge(region@data,espece, by.x="NOM_REG",by.y="nom_region", all.x=TRUE) ;region2 pal<- c('#F41322','#F49E13','#E5D310','#F4F009', '#2DF70E','#0A9B0F') region@data$test <- as.character(cut(as.numeric(region@data$note_finale), breaks = c(0,1,2,3,4,5,100), labels = pal, include.lowest = TRUE, right = FALSE)) legende2<-c('0','1','2','3','4','5') x<-plot(region, col=region@data$test, border = "dark grey" ) title(main=nom_espece) legend("bottomleft",legend =legende2,fill=pal,border = "dark grey",title = "Note finale",bty = "n")
Voilà. Je reste dans l'attente de bonnes idées
Hors ligne
#4 Fri 28 November 2014 12:59
- HadriC
- Juste Inscrit !
- Date d'inscription: 28 Nov 2014
- Messages: 2
Re: [R] Représentation cartographique
Bonjour,
deux commentaires sur ce problème.
1. Sur la jointure sur la table attributaire, il faut absolument éviter d'utiliser la fonction merge, elle est source d'erreur. Nous l'avions mise par erreur dans la première version du manuel "R pour les géographes" puis rapidement modifiée. Il faut utiliser la fonction match, ou la fonction utilisateur AttribJoin proposée dans la nouvelle version du manuel "R et espace" : http://framabook.org/16-r-et-espace/
2. Concernant l'attribution de couleurs à des modalités d'une variable, il faut comprendre le fonctionnement de l'argument col dans l'appel du plot "plot(region, col = region@data$test)". Cet argument va chercher une indication de couleur dans la variable indiquée (voir le Chapitre 9 du manuel "R et espace"). On peut donc tout simplement coder ou recoder une variable (testcol ci-dessous) en indiquant la couleur :
region$testcol[region$test == 1] <- "green"
region$testcol[region$test == 2] <- "red"
etc.
ou bien avec ifelse(region$test == 1, "green", "red") etc.
S'il y a beaucoup de modalités on peut utiliser la fonction mapvalues du package plyr avec un dictionnaire de correspondances. Créer un tableau (dico) à deux colonnes "VALEUR", "COULEUR" avec la correspondance souhaitée.
region$testcol <- mapvalues(region$test, from = dico$VALEUR, to = dico$COULEUR)
Dans tous les cas, il vaut mieux utiliser la nouvelle version du manuel "R et espace" (http://framabook.org/16-r-et-espace) elle est meilleure et plus complète.
Bon courage
Hors ligne
#5 Fri 28 November 2014 13:52
- HadriC
- Juste Inscrit !
- Date d'inscription: 28 Nov 2014
- Messages: 2
Re: [R] Représentation cartographique
Petit ajout par rapport au message précédent : on peut bien sûr définir directement des vecteurs de valeurs dans la fonction mapvalues, sans passer par la création d'un tableau qui fasse office de dictionnaire.
region$testcol <- mapvalues(region$test, from = c(1, 2, 3), to = c("red", "green", "blue"))
Hors ligne
#6 Mon 01 December 2014 09:54
- Anaïs Just
- Participant actif
- Lieu: Montreuil
- Date d'inscription: 10 Dec 2007
- Messages: 131
Re: [R] Représentation cartographique
Merci beaucoup pour tous ces conseils et précisions! je vais faire le test avec la fonction match.
Hors ligne
#7 Mon 01 December 2014 16:09
- Anaïs Just
- Participant actif
- Lieu: Montreuil
- Date d'inscription: 10 Dec 2007
- Messages: 131
Re: [R] Représentation cartographique
Merci, ça a super bien fonctionné!
Une autre petite question (je tente ma chance).
Je cherche à creer des cartes en boucle et j'uilise normalement
Code:
liste<-list("espece1","espece2","espece3",...) for (i in liste) {...}
la liste qui en résulte est de ce type
Code:
[[1]] [1] "espece1" [[2]] [1] "espece2" [[3]] [1] "espece3"
ce qui me permet de faire varier le nom de l'espèce dans ma requête sql qui récupère les notes pour une espèce.
Comme j'ai plusieurs centaines d'espèces, plutôt que de mettre en dur la liste dans le code je cherchais à la générer à partir d'un vecteur (un champ d'une table sous postgres.
J'ai tenté le as.liste(vecteur) comme indiqué ici
http://stackoverflow.com/questions/1636 … ent-in-the
(j'ai vérifié l'exemple fonctionne bien)
Code:
requete<- "SELECT distinct espece from matable" code_espece <- dbGetQuery(con, requete) as.list(code_espece)
mais cela me renvoi
[1] "espece1" "espece2" "espece3"
et une erreur a l'execution de ma boucle de type:
Could not create executeSELECT * from matable2 where nom_espece=c("espece1", "espece2", "espece3" [... truncated]
Je ne comprend pas que l'expression as.list fonctionne avec un vecteur de type c("1","2","3") et pas avec un vecteur issu d'une table de données: pourquoi ne lit-il pas chaque ligne comme un élément de liste?
Merci d'avance pour l'aide que vous pourrez m'apporter
Hors ligne
#8 Mon 01 December 2014 16:27
- Anaïs Just
- Participant actif
- Lieu: Montreuil
- Date d'inscription: 10 Dec 2007
- Messages: 131
Re: [R] Représentation cartographique
C'est bon j'ai trouvé.
Il fallait faire
Code:
as.list(t(code_espece))
Hors ligne
#9 Tue 02 December 2014 15:28
- Anaïs Just
- Participant actif
- Lieu: Montreuil
- Date d'inscription: 10 Dec 2007
- Messages: 131
Re: [R] Représentation cartographique
Bonjour,
re-moi....
Savez vous comment on peut afficher un dataframe directement en dessous d'une carte?
Ne trouvant pas de doc a ce sujet j'ai tenté de modifier le:
Code:
text(x=coordx,y=coordy,labels="TEXTE", font=1, cex=0.5)
en faisant un:
Code:
text(x=coordx,y=coordy,labels=tableau.espece, font=1, cex=0.5)
Mais cela ne fonctionne pas.
Merci d'avance
Hors ligne
#10 Tue 02 December 2014 22:05
- n314
- Participant assidu
- Date d'inscription: 6 Sep 2005
- Messages: 706
Re: [R] Représentation cartographique
Pour information au cas ou, il existe un découpage écologique et forestier peut etre plus adapte que les régions http://inventaire-forestier.ign.fr/spip … article773
Hors ligne