【问题标题】:Leaflet colours for polylines折线的传单颜色
【发布时间】:2016-02-16 16:09:48
【问题描述】:

我想使用一个基本的 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) 

之前有传单功能,但还是没有解决颜色问题。

任何帮助获得不同颜色的三个折线将不胜感激。

【问题讨论】:

    标签: r leaflet


    【解决方案1】:

    这是一种为数据集中的每个组自动执行的方法:

    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
    

    【讨论】:

    • 是否有办法以编程方式为任意数量的组执行此操作?
    【解决方案2】:

    看看 ma​​pview,它基于 leaflet(至少适用于小型数据集)并且专为此类特定任务而设计。根本区别在于,您需要先将df 转换为SpatialLines* 类的对象,然后才能将数据传递给mapview。这是基于您的示例数据的短代码 sn-p。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-19
      • 1970-01-01
      • 2019-12-10
      • 2019-03-20
      • 2020-08-06
      • 1970-01-01
      • 2014-02-04
      • 1970-01-01
      相关资源
      最近更新 更多