2016-01-02 1 views
14

J'essaye de tracer la distribution écologique de quelques espèces d'organismes que j'étudie au-dessus du Golfe Arabe/Persique. Voici un exemple d'un code que j'ai essayé:ggplot_stat_density2d parcelles pour la distribution écologique

couche Backround

library(ggplot2) 
library(ggmap) 

nc <- get_map("Persian Gulf", zoom = 6, maptype = 'terrain', language = "English") 
ncmap <- ggmap(nc, extent = "device") 

D'autres couches

ncmap+ 
    stat_density2d(data=sample.data3, aes(x=long, y=lat, fill=..level.., alpha=..level..),geom="polygon")+ 
    geom_point(data=sample.data3, aes(x=long, y=lat))+ 
    geom_point(aes(x =50.626444, y = 26.044472), color="red", size = 4)+ 
    scale_fill_gradient(low = "green", high = "red") + scale_alpha(range = c(0.00, 0.25), guide = FALSE) 

mais je voudrais utiliser la stat_density2d pour montrer les distributions de centaines d'espèces (qui sont enregistrées dans des colonnes par exemple SP1 .... SPn) au-dessus du plan d'eau plutôt que d'afficher simplement la latitude et la longitude.

De même, est-il possible de restreindre ma carte de chaleur à seulement le plan d'eau? Je vais apprécier toute l'aide et les recommandations que je peux obtenir ce plaisir image generated with the code above

+1

Il serait avantageux d'obtenir une partie de votre sample.data3 de données. 'dput (head (sample.data3, 20))' devrait donner assez pour jouer dans 'ggplot' avec – Vedda

+3

Le besoin en eau est intéressant. –

+0

@Amstell, voici un lien dropbox vers un dossier compressé qui contient un projet Rstudi avec toutes les données d'exemple et le polygone avec lesquels je travaille. [lien] (https://www.dropbox.com/s/5zssgq4kqlykbf0/Persian%20Gulf.rar?dl=0) Merci – Hammao

Répondre

2

Mon approche à votre question est pragmatique: il suffit de mettre la couche des pays du Golfe sur la distribution de heatmap. Cela recadre le heatmap en conséquence. Notez, cependant, que le heatmap est toujours calculé comme s'il n'était pas recadré. Cela signifie que le calcul de densité est et non uniquement pour la masse d'eau, mais qu'il est simplement recadré visuellement. Par souci de reproductibilité, le code suivant suppose que vous avez décompressé le fichier .rar fourni par @Hammao et que vous avez exécuté le code dans le dossier Persian Gulf résultant.

# get sample data 
sample.data <- read.csv("sample.data3.csv") 

Maintenant, nous devons obtenir les formes de pays pour les pays du Golfe. J'utilise le package rworldmap pour cela.

# loading country shapes 
library(rworldmap) 

# download map of the world 
worldmap <- getMap(resolution = "high") # note that for 'resolution="high"' 
             # you also need the "rworldxtra" pkg 

# extract Persian Gulf countries... 
gulf_simpl <- worldmap[worldmap$SOVEREIGNT == "Oman" | 
         worldmap$SOVEREIGNT == "Qatar" | 
         worldmap$SOVEREIGNT == "United Arab Emirates" | 
         worldmap$SOVEREIGNT == "Bahrain" | 
         worldmap$SOVEREIGNT == "Saudi Arabia" | 
         worldmap$SOVEREIGNT == "Kuwait" | 
         worldmap$SOVEREIGNT == "Iraq" | 
         worldmap$SOVEREIGNT == "Iran", ] 

# ... and fortify the data for plotting in ggplot2 
gulf_simpl_fort <- fortify(gulf_simpl) 

# Now read data for the Persian Gulf, which we need to get the distances for 
# the extension of the map 
PG <- readOGR(dsn = ".", "iho") 
PG <- readShapePoly("iho.shp") 

PG <- fortify(PG) 

Maintenant, il s'agit simplement de tracer les couches dans le bon ordre.

# generate plot 
ggplot(sample.data) + 

    # first we plot the density... 
    stat_density_2d(aes(x = long, y = lat, 
         fill = ..level..), 
        geom="polygon", 
        alpha = 0.5) + 

    # ... then we plot the points 
    geom_point(aes(x = long, y = lat)) + 

    # gradient options 
    scale_fill_gradient(low = "green", high = "red") + 
    scale_alpha(range = c(0.00, 0.25), guide = FALSE) + 

    # and now put the shapes of the gulf states on top 
    geom_polygon(data = gulf_simpl_fort, 
       aes(x = long, 
        y = lat, group = group), 
       color = "black", fill = "white", 
       inherit.aes = F) + 

    # now, limit the displayed map only to the gulf 
    coord_equal(xlim = c(min(PG_fort$long), max(PG_fort$long)), 
       ylim = c(min(PG_fort$lat), max(PG_fort$lat))) + 
    theme_bw() 

enter image description here

+0

c'est exactement ce que je voulais faire ...cependant, au lieu de juste lat et long, je veux tracer pour chaque variable ... (je finirai avec plusieurs parcelles). lat & long est juste pour localiser spatialement la variable. Je vais modifier cette réponse en ajoutant une instruction de boucle de sorte que le "remplir = ..level .." de votre réponse permettra le changement de SP1 --- SPn. J'espère que cela clarifiera la question initiale. – Hammao

+0

Ok merci pour la clarification. J'ai mis à jour la réponse. Pour tracer lat/long pour chaque espèce séparément, vous pouvez également essayer d'utiliser des facettes. Puisqu'il y a tant d'espèces, il y aura beaucoup de facettes, cependant, et la lecture de la parcelle pourrait devenir difficile. Donc, comme vous l'avez suggéré, faire une boucle sur l'espèce et épargner des parcelles séparées pourrait être la meilleure façon de procéder, après tout. – Felix

+0

merci pour l'aide ... – Hammao