2016-03-10 5 views
7

erstellen (BTW, gibt es ein weiteres Paket, das tun würde, was ich will?)Prospekt auf R: Wie Schichten und Farben für jeden Faktor Ebene in Datenrahmen

Hier ist meine Daten-Set:

> head(df) 
    id groupID  lat  lon 
511 1 277706 -10.89834 -37.05893 
377 2 277706 -10.88870 -37.07695 
98 3 277705 -10.89050 -37.09406 
392 4 277697 -10.92131 -37.10525 
6 5 277705 -10.89050 -37.09406 
364 6 277697 -10.93730 -37.11600 

I Sie möchten mit Hilfe von Broschüren jede Zeile auf einer Karte basierend auf deren Breite und Länge darstellen. Außerdem soll jeder Marker (oder Popup oder CircleMarker) eine andere Farbe und einen anderen Layer haben, basierend auf der Variablen groupID.

Das Problem ist die Datenänderungen jeden Tag und ich weiß nicht, wie viele verschiedene einzigartige Ebenen ich für die Variable GroupID haben werde. In diesem Beispiel-Dataset gibt es 12 Ebenen, aber es kann zwischen 5 und 30 liegen. Die Beispiele in der documentation arbeiten mit einer vordefinierten Anzahl von Ebenen.

Hier ist, was ich versucht habe:

colorsmap = colors()[1:length(unique(df3$groupID))] 
groupColors = colorFactor(palette = "RdYlBu", domain = df3$groupID) 

leaflet(data = df3) %>% 
    addTiles() %>% 
    addCircleMarkers(lng = ~lon, lat = ~lat, color = ~groupColors(groupID), 
        group = ~groupID) %>% 
    #addLegend(position = "topright", pal = groupColors, values = ~groupID) %>% 
    addLayersControl(~groupID) 

Es ein Grundstück zur Verfügung stellt, aber wenn ich nur eine Ebene auszuwählen, führen Sie die anderen nicht disapper, wie sie sollten:

Bild:

enter image description here

Der Datensatz selbst:

> dput(df3) 
structure(list(id = 1:20, groupID = c(277698L, 277715L, 277704L, 
277706L, 277705L, 277705L, 277719L, 277705L, 277705L, 277709L, 
277706L, 277705L, 277704L, 277706L, 277715L, 277702L, 277719L, 
277706L, 277715L, 277706L), lat = c(-10.8172615660655, -10.8904055150991, 
-10.8887597563482, -10.90203509, -10.9001514, -10.8997748900025, 
-10.8960177351343, -10.8896179908615, -10.8991450456802, -10.9224848475651, 
-10.9000373151094, -10.8905013650562, -10.8889438100208, -10.90, 
-10.8861897462579, -10.9326053452642, -10.8916601751623, -10.902075281944, 
-10.8822231928033, -10.9079483812524), lon = c(-36.9248145687343, 
-37.0665064455395, -37.0921721937304, -37.05829295, -37.0969278, 
-37.0976847916125, -37.0840372102666, -37.0963566353117, -37.0945971936751, 
-37.0549293249471, -37.066113628594, -37.0940632483155, -37.095505683692, 
-37.0590422449149, -37.0782556623101, -37.0698746017798, -37.0841003949028, 
-37.0593363285999, -37.0724709841895, -37.0817244836096)), .Names = c("id", 
"groupID", "lat", "lon"), row.names = c(20L, 23L, 8L, 36L, 14L, 
13L, 16L, 2L, 11L, 1L, 26L, 6L, 5L, 31L, 22L, 50L, 17L, 34L, 
25L, 42L), class = "data.frame") 

Antwort

8
library(leaflet) 

groups = as.character(unique(df3$groupID)) 

map = leaflet(df3) %>% addTiles(group = "OpenStreetMap") 
for(g in groups){ 
    d = df3[df3$groupID == g, ] 
    map = map %>% addCircleMarkers(data = d, lng = ~lon, lat = ~lat, 
           color = ~groupColors(groupID), 
           group = g) 

} 
map %>% addLayersControl(overlayGroups = groups) 

enter image description here

2

Der Vollständigkeit halber ist dies nun problemlos machbar mit mapview beide zcol und burst Argumenten:

library(mapview) 
library(sp) 

df3 <- structure(list(id = 1:20, 
         groupID = c(277698L, 277715L, 277704L, 
            277706L, 277705L, 277705L, 
            277719L, 277705L, 277705L, 277709L, 
            277706L, 277705L, 277704L, 277706L, 
            277715L, 277702L, 277719L, 
            277706L, 277715L, 277706L), 
         lat = c(-10.8172615660655, -10.8904055150991, 
           -10.8887597563482, -10.90203509, -10.9001514, 
           -10.8997748900025, -10.8960177351343, 
           -10.8896179908615, -10.8991450456802, 
           -10.9224848475651, -10.9000373151094, 
           -10.8905013650562, -10.8889438100208, 
           -10.90, -10.8861897462579, 
           -10.9326053452642, -10.8916601751623, 
           -10.902075281944, -10.8822231928033, 
           -10.9079483812524), 
         lon = c(-36.9248145687343, -37.0665064455395, 
           -37.0921721937304, -37.05829295, -37.0969278, 
           -37.0976847916125, -37.0840372102666, 
           -37.0963566353117, -37.0945971936751, 
           -37.0549293249471, -37.066113628594, 
           -37.0940632483155, -37.095505683692, 
           -37.0590422449149, -37.0782556623101, 
           -37.0698746017798, -37.0841003949028, 
           -37.0593363285999, -37.0724709841895, 
           -37.0817244836096)), 
       .Names = c("id", "groupID", "lat", "lon"), 
       row.names = c(20L, 23L, 8L, 36L, 14L, 13L, 16L, 2L, 11L, 
           1L, 26L, 6L, 5L, 31L, 22L, 50L, 17L, 34L, 25L, 42L), 
       class = "data.frame") 

## convert df3 to spatialPointsDataFrame for use with mapview 
coordinates(df3) <- ~ lon + lat 
proj4string(df3) <- "+init=epsg:4326" 

## now burst column "groupID" 
mapview(df3, zcol = "groupID", burst = TRUE) 

Hinweis: Dies ist derzeit nur in der Entwicklungsversion von mapview, die mit

installiert werden kann
devtools::install_github("environmentalinformatics-marburg/mapview", ref = "develop") 
Verwandte Themen