如何用R语言基于四色定理实现地图多边形邻接异色着色?
实现相邻多边形四色随机着色(R语言)
问题背景
已使用sf、leaflet等包制作地图,尝试过随机分配颜色,但希望基于四色定理实现相邻多边形颜色互不相同的随机着色效果,已通过igraph将矢量数据转换为邻接图,需完成后续着色实现。
实现步骤与代码
1. 基于邻接图执行随机化图着色
利用igraph的贪心着色算法,通过随机节点遍历顺序实现随机化的图着色,保证相邻节点(对应相邻多边形)颜色不同,且符合四色定理的最少颜色要求。
2. 映射颜色到着色结果
生成一组随机颜色(至少4种),将算法输出的颜色索引映射为具体颜色值。
3. 应用到Leaflet地图
把分配好的颜色绑定到sf对象,最终渲染地图。
完整代码如下:
library(sf) library(leaflet) library(leaflet.extras) library(igraph) # 加载并预处理数据 nc <- st_read(system.file("gpkg/nc.gpkg", package="sf"), quiet = TRUE) %>% st_transform(st_crs(4326)) %>% st_cast('POLYGON') # 创建邻接图 adj <- st_touches(nc, sparse = TRUE) g <- graph_from_adjacency_matrix(as.matrix(adj)) # 执行带随机化的贪心着色:随机节点顺序保证每次结果不同 set.seed(sample(1:1000, 1)) coloring <- greedy_color(g, order = sample(V(g))) # 生成随机颜色组(至少4种,可按需扩展) color_palette <- sample(c("red", "blue", "green", "yellow", "purple", "orange", "cyan"), 4) # 将着色索引映射为具体颜色 nc$color <- color_palette[coloring$color] # 渲染地图 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))
关键说明
greedy_color()的order = sample(V(g))参数随机遍历节点,避免固定顺序导致的重复着色模式,实现真正的随机效果。- 若需要更多色彩选择,可直接扩展
color_palette中的颜色列表,保留至少4种即可满足四色定理要求。 set.seed(sample(1:1000, 1))每次取随机种子,确保每次运行得到不同的着色结果。
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

