2015-10-14 2 views
0

Je suis nouveau en utilisant R et je trouve très difficile de tracer ces données J'ai déjà obtenu ma carte (en utilisant rworldmap). Voici les 2 lignes de code que j'ai utilisé:Tracer les données d'un fichier csv sur une carte R, en soulignant leur origine différente

library(rworldmap) 
newmap <- getMap(resolution = "low") 
plot(newmap) 
plot(newmap, xlim = c(-180, 180), ylim = c(-90, 90), asp = 1, fill=TRUE, col="white", bg="lightblue",) 

Ensuite, je l'ai fait comme suit pour afficher le contenu de mon fichier .csv

coordinates <- read.csv("seqmap.csv", header=T, fill=T, col.names=c("ID CODE", "latitude", "longitude", "sample nature", "seq.methods"), row.names=NULL) 
head(coordinates) 

Maintenant, voici le problème: I veulent comme polygone:

SQUARE pour la nature de l'échantillon = sédiments

CIRCLE pour la nature de l'échantillon = eau

Et comme la couleur de remplissage pour le polygone choisi

1) ROUGE pour seq.methods = Illumina

2) BLEU pour seq.methods = 454

3) VERT pour seq.methods = ion torrent

4) JAUNE pour seq.methods = Sanger

a titre d'exemples: pour un échantillon de sédiment séquencée avec Illumina: un squa re avec le rouge comme couleur de remplissage

Pour un échantillon d'eau séquencée avec 454: un cercle bleu comme couleur de remplissage

Je suis stucked à ce point et avec ma connaissance, je sens que je ne peux pas aller plus loin :( au lien suivant, vous pouvez trouver le fichier .csv https://www.dropbox.com/s/t812lf6xgc0d6kf/seqmap.csv?dl=0

Nous vous remercions d'avance pour toute aide et désolé pour toute erreur de grammaire/orthographe, l'anglais est pas ma langue maternelle :)

Répondre

0

Si vous pouvez vivre avec des caractères au lieu de polygones, vous pouvez vouloir essayer comme ceci:

library(rworldmap) 
newmap <- getMap(resolution = "low") 
download.file("https://www.dropbox.com/s/t812lf6xgc0d6kf/seqmap.csv?dl=1", csv <- tempfile(fileext = ".csv")) 
coordinates <- read.csv(csv, header=T, fill=T, sep=";", col.names=c("ID CODE", "latitude", "longitude", "sample nature", "seq.methods"), row.names=NULL) 

pdf(pdffile <- tempfile(fileext = ".pdf"), width = 80, height = 40) 
plot(newmap, xlim = c(-180, 180), ylim = c(-90, 90), asp = 1, fill=TRUE, col="white", bg="lightblue",) 

with(coordinates, 
    points(x=longitude, y=latitude, cex=.5, # reduce symbol size a bit 
      col=adjustcolor(c("Illumina"="red", "454"="blue", "ion torrent"="green", "Sanger"="yellow")[as.character(seq.methods)], alpha.f = .5), 
      pch=c("sediment"=15, "water"=19)[as.character(sample.nature)] 
    ) 
) 
dev.off() 
shell.exec(pdffile) # open pdf doc on windows to zoom/pan easily... 
+0

Salut lukeA, je vous remercie de l'aide! Je ne peux pas entièrement comprendre la deuxième partie, avec (coordonnées, points (x = longitude, y = latitude, cex = .5, # réduire la taille du symbole un bit col = adjustcolor (c ("Illumina" = "red "," 454 "=" bleu "," ion torrent "=" vert "," Sanger "=" jaune ") [en tant que caractère (seq.méthodes)], alpha.f = 0,5), pch = c ("sédiment" = 15, "eau" = 19) [en tant que caractère (échantillon.nature)] ) ) dev.off() shell.exec (pdffile) # ouvrir pdf doc sur les fenêtres à agrandir/agrandir facilement ... Il me montre juste la carte du monde en format pdf (<- bonne idée!), mais les points ne sont pas tracés ... Où je me trompe? – Plumeria

+0

Les points devraient être là, mais très minuscule. Peut-être remettre 'cex' à' cex = 1' (ou plus grand) et/ou réduire les dimensions du document dans 'width' et' height', pour le rapprocher davantage? Ou ai-je fait une erreur? – lukeA

+0

Non, je l'ai réécrit et ça marche ici. Comme je l'ai dit, vous devrez peut-être jouer avec 'width',' height', 'cex' et aussi' alpha.f', qui contrôle la transparence des points (1 = solide, 0 = transparent). En outre, il semble mieux avec 'resolution =" high "'. :) – lukeA

0

Comme vos points de données sont répartis partout dans le monde, il peut être difficile de distinguer les points sur la carte lorsque vous tracez tout dans une carte. Comme alternative, vous pouvez créer une intrigue à facettes avec un gros plan pour plusieurs parties du monde.Je propose les étapes suivantes:

1: lire les données et assurez-vous qu'ils ont la bonne classe:

coordinates <- read.csv2("seqmap.csv", header=T, fill=T, 
         col.names=c("ID.CODE", "latitude", "longitude", "sample.nature", "seq.methods"), 
         row.names=NULL) 
coordinates$latitude <- as.numeric(as.character(coordinates$latitude)) 
coordinates$longitude <- as.numeric(as.character(coordinates$longitude)) 

2: charge les bibliothèques nécessaires:

library(ggplot2) 
library(ggmap) 
library(grid) 
library(gridExtra) 

3: Créez des groupes de points et attribuez des valeurs de cluster aux points:

km <- kmeans(coordinates[,c("longitude","latitude")], centers = 6) 
coordinates$cluster <- km$cluster 

4: Obtenez les cartes pour les différents groupes:

> km$centers 
    longitude latitude 
1 -156.7000 71.37000 
2 -88.3875 28.82875 
3 -39.0700 -17.65200 
4 139.3400 35.88667 
5 94.4150 -67.29500 
6 -64.5000 32.17000 

map1 <- get_map(location = c(lon = -156.7, lat = 71.37), zoom = 7) 
map2 <- get_map(location = c(lon = -88.3875, lat = 28.82875), zoom = 9) 
map3 <- get_map(location = c(lon = -39.07, lat = -17.652), zoom = 9) 
map4 <- get_map(location = c(lon = 139.34, lat = 35.88667), zoom = 8) 
map5 <- get_map(location = c(lon = 94.415, lat = -67.295), zoom = 4) 
map6 <- get_map(location = c(lon = -64.5, lat = 32.17), zoom = 10) 

5: Créer les cartes et les stocker sous forme d'objets:

p1 <- ggmap(map1) + 
    geom_point(data=coordinates[coordinates$cluster==1,], aes(x=longitude, y=latitude, shape=sample.nature, fill=seq.methods), size=3) + 
    scale_shape_manual(values=c("sediment"=21,"water"=22)) + 
    scale_fill_manual(values=c("Illumina"="red")) + 
    guides(shape=FALSE, fill=FALSE) + 
    ggtitle("Alaska") 

p2 <- ggmap(map2) + 
    geom_point(data=coordinates[coordinates$cluster==2,], aes(x=longitude, y=latitude, shape=sample.nature, fill=seq.methods), size=3) + 
    scale_shape_manual(values=c("sediment"=21,"water"=22)) + 
    scale_fill_manual(values=c("Illumina"="red","ion torrent"="green")) + 
    guides(shape=FALSE, fill=FALSE) + 
    ggtitle("New Orleans") 

p3 <- ggmap(map3) + 
    geom_point(data=coordinates[coordinates$cluster==3,], aes(x=longitude, y=latitude, shape=sample.nature, fill=seq.methods), size=3) + 
    scale_shape_manual(values=c("water"=22)) + 
    scale_fill_manual(values=c("454"="blue")) + 
    guides(shape=FALSE, fill=FALSE) + 
    ggtitle("Brazil") 

p4 <- ggmap(map4) + 
    geom_point(data=coordinates[coordinates$cluster==4,], aes(x=longitude, y=latitude, shape=sample.nature, fill=seq.methods), size=3) + 
    scale_shape_manual(values=c("sediment"=21)) + 
    scale_fill_manual(values=c("454"="blue")) + 
    guides(shape=FALSE, fill=FALSE) + 
    ggtitle("Japan") 

p5 <- ggmap(map5) + 
    geom_point(data=coordinates[coordinates$cluster==5,], aes(x=longitude, y=latitude, shape=sample.nature, fill=seq.methods), size=3) + 
    scale_shape_manual(values=c("water"=22)) + 
    scale_fill_manual(values=c("Sanger"="yellow")) + 
    guides(shape=FALSE, fill=FALSE) + 
    ggtitle("Antartica") 

p6 <- ggmap(map6) + 
    geom_point(data=coordinates[coordinates$cluster==6,], aes(x=longitude, y=latitude, shape=sample.nature, fill=seq.methods), size=3) + 
    scale_shape_manual(values=c("water"=22)) + 
    scale_fill_manual(values=c("454"="blue","Illumina"="red")) + 
    guides(shape=FALSE, fill=FALSE) + 
    ggtitle("Bermuda") 

6: Créer une légende séparée:

p0 <- ggplot(data=coordinates, aes(x=longitude, y=latitude, shape=sample.nature, fill=seq.methods, color=seq.methods)) + 
    geom_point(size=4) + 
    scale_shape_manual("Sample:",values=c("sediment"=21,"water"=22)) + 
    scale_fill_manual("Method:",values=c("454"="blue","Illumina"="red","ion torrent"="green","Sanger"="yellow")) + 
    scale_color_manual("Method:",values=c("454"="blue","Illumina"="red","ion torrent"="green","Sanger"="yellow")) + 
    theme(legend.key=element_rect(fill=NA)) 

# function to extract the legend (borrowed from: https://github.com/hadley/ggplot2/wiki/Share-a-legend-between-two-ggplot2-graphs) 
g_legend<-function(a.gplot){ 
    tmp <- ggplot_gtable(ggplot_build(a.gplot)) 
    leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box") 
    legend <- tmp$grobs[[leg]] 
    return(legend)} 

legend <- g_legend(p0) 
lwidth <- sum(legend$width) 

7: Créer le tracé final avec:

grid.arrange(arrangeGrob(p1, p2, p3, p4, p5, p6, ncol=2), 
      legend, widths=unit.c(unit(1, "npc") - lwidth, lwidth), nrow=1) 

qui donne le résultat suivant:

enter image description here

+0

Merci Jaap, cette version en cluster a bien fonctionné pour cette situation! J'ai été impressionné par la rapidité et la précision de votre réponse, si ce n'est pas un problème, je veux vous demander comment généraliser cet exemple, autrement dit: si j'ai un jeu de données très étendu en .csv (de l'ordre de 600 -800 emplacements) comment puis-je faire la carte du monde (non groupée)? En utilisant aussi les indications données par @lukeA, j'ai pu obtenir la carte du monde en pdf, mais il y a quelque chose qui ne va pas dans la phase de traçage ... Les points ne sont pas affichés sur la carte et je ne suis pas en mesure d'ajouter légende :(Pouvez-vous simplement m'indiquer les étapes? – Plumeria

+0

Problème résolu, il y avait juste quelques problèmes dans mon script complet.Je suis encore nouveau à l'aide de R, mais travaille dur pour améliorer :) Merci encore – Plumeria