R语言北卡地图多边形无邻接同色着色报错修复求助
修复多边形无邻接同色着色的错误问题
首先定位错误根源:greedy_vertex_coloring()返回的是顶点的颜色索引(整数),而非直接的颜色名称。你没有将这些索引映射到预设的vertex.colors向量,也未正确将颜色列添加到nc这个sf对象中,导致后续赋值或绘图时出现长度不匹配的错误。
以下是完整的修复代码及步骤:
1. 完整修正后的代码流程
library(sf) library(leaflet) library(leaflet.extras) library(igraph) # Load and prepare data nc <- st_read(system.file("gpkg/nc.gpkg", package = "sf"), quiet = TRUE) %>% st_transform(st_crs(4326)) %>% st_cast("POLYGON") # Convert to adjacency graph adj <- st_touches(nc, sparse = TRUE) g <- graph_from_adjacency_matrix(as.matrix(adj)) # Greedy coloring with correct color mapping vertex.colors <- c("red", "blue", "green", "yellow", "purple", "orange") # 获取颜色索引并映射到实际颜色 color_indices <- greedy_vertex_coloring(g) # 将颜色添加到nc对象的属性中 nc$color <- vertex.colors[color_indices] # Plot the colored map leaflet(data = nc) %>% addTiles(group = "OSM") %>% addProviderTiles(provider = providers$OpenStreetMap) %>% addPolygons(weight = 1, popup = ~NAME, label = ~NAME, group = "name", fillColor = ~color, fillOpacity = 0.5) %>% addSearchFeatures(targetGroups = "name", options = searchFeaturesOptions(zoom = 10, openPopup = TRUE))
2. 关键修复点说明
- 颜色索引映射:
greedy_vertex_coloring(g)返回的是每个多边形对应的颜色组编号(比如1对应red,2对应blue),必须用vertex.colors[color_indices]将整数索引转换为实际的颜色字符串。 - 添加颜色列到sf对象:通过
nc$color <- ...将颜色列绑定到nc的属性中,这样leaflet的fillColor = ~color才能正确识别引用该列。 - 简化绘图代码:原代码中重复调用
addPolygons,修正后只保留一次调用,避免图层叠加混乱。
额外优化建议
- 若想让颜色分配更随机,可以先打乱
vertex.colors的顺序:vertex.colors <- sample(c("red", "blue", "green", "yellow", "purple", "orange")) - 检查邻接关系:可以用
plot(g)快速查看生成的网络图,确认多边形的邻接逻辑是否正确。
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

