2016-02-02 2 views
2

Я хотел бы использовать базовый data.frame, чтобы получить три ломаные каждого из различных цветовлистовка цвета для ломаных

настоящее время я использую следующий код в качестве примера.

require(leaflet) 
df <- data.frame(lat=c(rnorm(20,50),rnorm(40,0),rnorm(40,-30)), 
       lon=rnorm(100), 
       group=rep(c("a","b","c"),times=c(20,40,40)), 
       col=rep(rainbow(3,alpha=NULL),times=c(20,40,40))) 
leaflet(df) %>% addTiles() %>% addPolylines(lng=~lon,lat=~lat,color=~col) 

Но я получаю одну непрерывную линию, а не три отдельные строки для каждой группы.

я могу отделить линии, но делать в очень безвкусный трюк:

df_a <- rbind(df[df$group=="a",],data.frame(lat=NA,lon=NA,group="a",col=NA)) 
df_b <- rbind(df[df$group=="b",],data.frame(lat=NA,lon=NA,group="b",col=NA)) 
df_c <- rbind(df[df$group=="c",],data.frame(lat=NA,lon=NA,group="c",col=NA)) 
df <- rbind(df_a,df_b) 
df <- rbind(df,df_c) 

перед функцией листовки, но она по-прежнему не решает проблему цвета.

Любая помощь, чтобы получить три полилинии разных цветов, будет очень признательна.

ответ

2

Вот способ автоматизировать для каждой группы в наборе данных:

map <- leaflet(df) 
map <- addTiles(map) 
for(group in levels(df$group)){ 
     map <- addPolylines(map, lng=~lon,lat=~lat,data=df[df$group==group,], color=~col) 
     } 
map 
+0

Будут ли способ сделать это программно для любого количества групп? –

+0

@ h.l.m Я отредактировал ответ – HubertL

0

Взгляните на MapView, который основан на листовки (по крайней мере, для небольших наборов данных) и предназначен для такие конкретные задачи. Основное различие заключается в том, что вам необходимо преобразовать df в объект класса SpatialLines*, прежде чем вы сможете передать данные до mapview. Ниже приведен фрагмент кода, основанный на ваших данных образца.

## load packages 
library(sp) 
library(mapview) 

## sample data 
set.seed(10) 
df <- data.frame(lat = c(rnorm(20, 50), rnorm(40, 0), rnorm(40, -30)), 
       lon = rnorm(100), 
       group = rep(letters[1:3], times = c(20, 40, 40)), 
       col = rep(rainbow(3, alpha = NULL), times = c(20, 40, 40)), 
       stringsAsFactors = FALSE) 

## 'Lines' list 
lst_lns <- lapply(letters[1:3], function(i) { 
    df_sub <- subset(df, group == i) 
    ln <- Line(df_sub[, 2:1]) 
    Lines(list(ln), ID = i) 
}) 

## to 'SpatialLines' 
sln <- SpatialLines(lst_lns, proj4string = CRS("+init=epsg:4326")) 

## to 'SpatialLinesDataFrame' 
slndf <- SpatialLinesDataFrame(sln, match.ID = FALSE, 
           data = unique(df[, c("group", "col")])) 

## display data 
mapview(slndf, zcol = "group", color = [email protected]$col) 

grouped_lines

Смежные вопросы