2016-01-02 10 views
14

Próbuję wykreślić rozmieszczenie ekologiczne niektórych gatunków organizmów, które badam nad Zatoką Perską. Oto przykładowy kod Próbowałem:ggplot_stat_density2d działki do ekologicznej dystrybucji

warstwa Backround

library(ggplot2) 
library(ggmap) 

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

Inne warstwy

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) 

ale będę chciał użyć stat_density2d, aby wyświetlić rozkłady setek gatunków (które są zapisywane w kolumnach np. SP1 .... SPn) nad ciałem wodnym zamiast wyświetlania szerokości i długości geograficznej.

Czy możliwe jest ograniczenie mojej mapy cieplnej tylko do części wód? Będę wdzięczni za każdą pomoc i sugestie mogę dostać na to podobać image generated with the code above

+1

To byłoby korzystne, aby niektóre z sample.data3 danych. 'dput (head (sample.data3, 20))' powinien dać wystarczającą ilość do gry w 'ggplot' z – Vedda

+3

Zapotrzebowanie na wodę jest interesujące. –

+0

@Amstell, tutaj znajduje się link do skrzynki ze skompresowanym folderem, który zawiera projekt Rstudi z wszystkimi przykładowymi danymi i poligonem, z którymi pracuję. [link] (https://www.dropbox.com/s/5zssgq4kqlykbf0/Persian%20Gulf.rar?dl=0) Dziękujemy – Hammao

Odpowiedz

2

moje podejście do Twoje pytanie jest pragmatyczne: wystarczy położyć warstwę krajach Zatoki nad, rozkład termiczna. To odpowiednio dostosowuje mapę cieplną. Należy jednak pamiętać, że mapa termiczna jest nadal obliczana tak, jakby nie była przycinana. Oznacza to, że obliczenie gęstości jest , a nie ograniczone tylko do części wodnej, ale jest po prostu przycięte wizualnie.

Dla zachowania powtarzalności, poniższy kod zakłada rozpakowanie pliku .rar dostarczonego przez @Hammao i wykonanie kodu w powstałym folderze Persian Gulf.

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

Teraz musimy uzyskać kształty kraju dla krajów Zatoki Perskiej. Używam do tego pakietu rworldmap.

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

Teraz jest to po prostu kwestia wykreślenia warstw we właściwej kolejności.

# 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

to jest dokładnie to, co chciałem zrobić ...jednak, zamiast tylko lat i długo, chcę wykreślić dla każdej zmiennej ... (zakończę z kilku działek). lat & long służy do przestrzennego zlokalizowania zmiennej. Zmodyfikuję tę odpowiedź, dodając instrukcję pętli, aby "wypełnić = .. poziom" odpowiedzi odpowiadało zmianie SP1 --- SPn. Mam nadzieję, że to sprawi, że pierwsze pytanie będzie jaśniejsze. – Hammao

+0

Ok dzięki za wyjaśnienie. Zaktualizowałem odpowiedź. Aby policzyć lat/długo dla każdego gatunku osobno, możesz również spróbować użyć faset. Ponieważ istnieje tak wiele gatunków, będzie wiele aspektów, a czytanie wątku może stać się trudne. Zatem, jak sugerujesz, przejście przez gatunek może uratować oddzielne wątki. – Felix

+0

dzięki za pomoc ... – Hammao