我想使用基本的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)
在传单功能之前,但它仍然无法解决颜色问题。
非常感谢任何帮助三条折线不同的颜色。
答案 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)