You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 14:45:36