如何为 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
我不认为像 color
和 stroke
这样的论点会读取线的每个点的向量的唯一水平,如果你有多个唯一的每一层,这就是为什么你需要 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"
)
一团糟,因为我只是对随机点进行了采样,但你明白了。
我有一个包含经纬度坐标的数据集。每个坐标都属于一个组,我想使用传单将它们与多段线连接起来。我正在尝试为不同的线段赋予不同的颜色。我是传单的新手,所以我不知道我是否以正确的方式解决这个问题。
我已经尝试了 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
我不认为像 color
和 stroke
这样的论点会读取线的每个点的向量的唯一水平,如果你有多个唯一的每一层,这就是为什么你需要 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"
)
一团糟,因为我只是对随机点进行了采样,但你明白了。