如何为 Leaflet R 中的折线段分配不同的颜色

How to assign different colors to polyline segments in Leaflet R

我有一个包含经纬度坐标的数据集。每个坐标都属于一个组,我想使用传单将它们与多段线连接起来。我正在尝试为不同的线段赋予不同的颜色。我是传单的新手,所以我不知道我是否以正确的方式解决这个问题。

我已经尝试了 here 提供的解决方案,但结果我只得到一种颜色。

我模拟了一个数据集来说明我的问题:

#Example dataframe
lat <- runif(10,-10.8544921875,2.021484375)
long <- runif(10,49.82380908513249,59.478568831926395)
group <- factor(c(1,1,1,1,2,2,2,1,1,1))
header <- c("lat", "long", "group")
df <- data.frame(lat, long, group)
colnames(df) <- header

我试过以下方法:

#Color palette
pal <- colorFactor(palette = c('navy', 'red'), 
              levels = levels(df$group))

#Graph
leaflet(df) %>%
  addTiles() %>% 
  addPolylines(lng = ~as.numeric(df$long),
               lat = ~as.numeric(df$lat), stroke = pal(df$group), 
               opacity = 0.1)

我希望属于第 1 组和第 2 组的点之间的多段线显示红色,而其余部分只是蓝色(或两种颜色的任意组合)。但是,我只得到一种颜色。不透明度似乎也不匹配(我定义了 0.1 的不透明度,但生成的多段线的值肯定为 1)。

任何人都可以指出我做错了什么吗?

此外,(使用较大的数据集)我注意到,一旦我向数据集的多段线添加颜色,该过程的计算量就会非常大。谁能给我指导来优化流程?

非常感谢任何帮助。提前致谢!!

每种颜色都需要作为单独的图层添加到地图中。

library(leaflet)
library(dplyr)

lat <- runif(10,-10.8544921875,2.021484375)
long <- runif(10,49.82380908513249,59.478568831926395)
group <- factor(c(1,1,1,1,2,2,2,1,1,1))
header <- c("lat", "long", "group")
col<-mapvalues(group,from=c(1,2),to=c("#00FF00","#FF0000")) #mannually add colors
#col<-mapvalues(group,from=c(1,2),to=substr(rainbow(2),1,7)) # programatically; looks like addpolylines wants hex not 8-digit colors
df <- data.frame(lat, long, group,col)
#colnames(df) <- header #you dont need this

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

我不认为像 colorstroke 这样的论点会读取线的每个点的向量的唯一水平,如果你有多个唯一的每一层,这就是为什么你需要 for。如果你颠倒颜色的顺序,你可以看到这个,例如

col<-mapvalues(group,from=c(1,2),to=c("#00FF00","#FF0000"))

col<-mapvalues(group,from=c(1,2),to=c("#FF0000","#00FF00"))

它只会拾取第一种颜色。

关于我的性能问题,以下代码片段非常有帮助:

map <- leaflet(df, options = leafletOptions(preferCanvas = TRUE))

您提到性能是一个问题,为此我建议使用 mapdeck 进行绘图

在这个例子中,我绘制了 100,000 行,由 group 变量着色。

设置数据

对于数据,我将起点和终点坐标放在同一行中。并使用 data.table 来制作它。

library(data.table)

lons <- seq(-180, 180, by = 0.0001)
lats <- seq(-90, 90,by = 0.0001)
n <- 1e5
dt <- data.table(
  lon = sample(lons, size = n)
  , lat = sample(lats, size = n)
  , group = sample(c(1,2), replace = T, size = n)
)

dt[
  , `:=`(
    lon_to = shift(lon, type = "lead")
    , lat_to = shift(lat, type = "lead")
  )
]

情节

您需要一个 Mapbox API 底层地图的密钥

使用 add_line() 函数在给定的起点和终点之间创建一条彩色线

mapdeck() %>%
    add_line(
        data = dt
        , origin = c("lon","lat")
        , destination = c("lon_to", "lat_to")
        , stroke_colour = "group"
    )

一团糟,因为我只是对随机点进行了采样,但你明白了。