有没有一种方法可以构建将类别值映射到颜色值的自定义定性调色板?
我正在尝试在Shiny中构建基本的传单地图,以其土地用途(因数)为属性宗地(多边形)着色。通常这很简单,但我需要为特定类别使用特定颜色。
例如,土地使用为“商业”的包裹的颜色必须为“#FF4C4C”。大约有10种土地利用类别。
我尝试将数据分成不同的层:
leaflet() %>%
addPolygons(data=parcels[parcels$category == 'Commercial',], fillColor = '#FF4C4C') %>%
addPolygons(data=parcels[parcels$category == 'Residential',], fillColor = '#E9E946')
以此类推,但是将大型SpatialPolygonsDataFrame切片十次比较慢,并且会消耗大量资源。另一个问题是,这些类别包含一些子类别,稍后需要显示,有时最多显示20个子类别,并且将spdf切片10 + 20次将不会。
我发现所有有关文档和堆栈溢出的问题都集中在定义两种或多种颜色之间的范围,但是我不希望出现范围。我想要在因子水平和特定颜色代码之间精确映射。
我希望对此有一个简单的答案。我希望我可以做类似的事情:
lu_pal <- c('Residential' = '#E9E946', 'Commercial' = '#FF4C4C')
并找到一种神奇的功能,可以将该列表变成我的调色板。
答案 0 :(得分:0)
您可以执行以下操作:
数据创建:
library(leaflet)
library(sp)
library(sf)
Sr1 = Polygon(cbind(c(2,4,4,1,2),c(2,3,5,4,2)))
Sr2 = Polygon(cbind(c(5,4,2,5),c(2,3,2,2)))
Sr3 = Polygon(cbind(c(4,4,5,10,4),c(5,3,2,5,5)))
Sr4 = Polygon(cbind(c(5,6,6,5,5),c(4,4,3,3,4)), hole = TRUE)
Srs1 = Polygons(list(Sr1), "s1")
Srs2 = Polygons(list(Sr2), "s2")
Srs3 = Polygons(list(Sr3, Sr4), "s3/4")
SpP = SpatialPolygons(list(Srs1,Srs2,Srs3), 1:3)
SpF <- st_as_sf(SpP)
SpF$category <- c("Commercial", "Residential", "Residential")
注意:我正在将sf
包中的SpatialPolygonsDataFrame切换为SimpleFeature,这样可以更轻松,更快速地处理/操作。
因此,您定义了一个匹配的data.frame,并为每个类别指定了颜色。然后,您使用merge
函数并定义要合并的列。在此示例中,多边形SpF
具有列category
,而匹配的数据帧具有列cat
。通过合并,新的Shapefile NewSp
也将具有保存颜色的列col
。然后,您只需将这些颜色传递给传单即可。
matching = data.frame(
cat = c("Commercial", "Residential"),
col = c("#FF4C4C", "#E9E946")
)
NewSp <- base::merge(SpF, matching, by.x ="category", by.y="cat")
leaflet() %>%
addTiles() %>%
addPolygons(data=NewSp, color=NewSp$col, opacity = 1, fillOpacity = 0.6)
答案 1 :(得分:0)
parcels$category <- as.factor(parcel$category)
factpal <- colorFactor(c("#FF4C4C", "#E9E946"), parcels$category)
leaflet(parcels) %>%
addPolygons(stroke = FALSE, smoothFactor = 0.2, fillOpacity = 1,
color = ~factpal(category))