Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Printemps des cartes 2024

#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 wink

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 smile

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 smile

Hors ligne

 

#10 Tue 02 December 2014 22:05

n314
Participant assidu
Date d'inscription: 6 Sep 2005
Messages: 694

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

En ligne

 

Pied de page des forums

Powered by FluxBB