Leaflet多边形的颜色

4

我希望使用一个基本的数据框来获取三条不同颜色的折线。

目前,我正在使用以下代码作为示例。

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) 

虽然已经使用了leaflet函数,但仍未解决颜色问题。

如有帮助使这三条折线呈现不同颜色的方法,将不胜感激。

2个回答

3

以下是自动化处理数据集中每个组的方法:

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

有没有办法以编程的方式来处理任意数量的组? - h.l.m

0

看一下基于 leafletmapview(至少对于小数据集),它已经为这些特定任务设计好了。根本的区别在于,在将数据传递给 mapview 之前,您需要将 df 转换为 SpatialLines* 类对象。以下是基于您的示例数据的简短代码片段。

## 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 = slndf@data$col)

grouped_lines


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接