我制作了以下地图:
library(sf)
library(leaflet)
library(leafgl)
library(colourvalues)
library(leaflet.extras)
nc <- st_read(system.file("gpkg/nc.gpkg", package="sf"), quiet = TRUE) %>%
st_transform(st_crs(4326)) %>%
st_cast('POLYGON')
leaflet(data = nc) %>% addPolygons( stroke = FALSE) %>% addTiles(group = "OSM") %>% addProviderTiles(provider = providers$OpenStreetMap) %>% addPolygons(data = nc, weight=1, popup = ~NAME,
label = ~NAME, group = "name", col = 'blue') %>%
addSearchFeatures(targetGroups = 'name', options = searchFeaturesOptions(zoom=10, openPopup=TRUE))
我想要给多边形上色,使它们更容易被看到 - 我通过随机分配颜色来实现这一点:nc$color <- sample(c("red", "blue", "green", "yellow", "purple"), nrow(nc), replace = TRUE)
leaflet(data = nc) %>%
addTiles(group = "OSM") %>%
addProviderTiles(provider = providers$OpenStreetMap) %>%
addPolygons(data = nc, weight=1, popup = ~NAME,
label = ~NAME, group = "name", fillColor = ~color, fillOpacity = 0.5) %>%
addSearchFeatures(targetGroups = 'name', options = searchFeaturesOptions(zoom=10, openPopup=TRUE))
我的问题:受到这个著名的计算机科学问题https://en.wikipedia.org/wiki/Four_color_theorem的启发,我想以随机的方式对多边形进行着色,使相邻的多边形颜色不同。
我认为我首先需要将 shapefile/地图转换成网络图:
library(igraph)
adj <- st_touches(nc, sparse = TRUE)
g <- graph_from_adjacency_matrix(as.matrix(adj))
plot(g)
我不确定如何继续解决这个问题 - 目前,我想到了一种间接的方法,即简单地选择许多不同的随机颜色来减少两个多边形具有相同颜色的可能性,但我对学习解决原始问题的新颖和创造性方法感兴趣。
请问有人可以向我展示如何做到这一点吗?
谢谢!
greedy_vertex_coloring()
函数。通常情况下,它无法仅使用四种颜色完成染色。当然,您需要构建多边形的邻接图。 - Szabolcs