折线的单张颜色

时间:2016-02-02 00:46:26

标签: r leaflet

我想使用基本的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 个答案:

答案 0 :(得分: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

答案 1 :(得分: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 = slndf@data$col)

grouped_lines