地图中的彩色多边形,使相邻的多边形具有不同的颜色

问题描述 投票:0回答:3

我制作了以下地图:

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/map转换成网络图:

library(igraph)
adj <- st_touches(nc, sparse = TRUE)
g <- graph_from_adjacency_matrix(as.matrix(adj))
plot(g)

我不确定如何继续这个问题 - 目前,我想到了一种间接方法,我只是选择许多不同的随机颜色来降低两个多边形具有相同颜色的几率,但我有兴趣了解新的和创造性的方法解决我原来的问题。

有人可以告诉我怎么做吗?

谢谢!

r leaflet visualization igraph
3个回答
3
投票

您可以使用 MapColoring 包。这个包使用 DSAtur 算法,在这种情况下,它能够找到问题的最小(四色)解决方案,而基于贪婪算法的解决方案则不能。一般来说,DSatur已被证明比贪婪算法推导出更好的顶点着色。

devtools::install_github("hunzikp/MapColoring")
library(sp)
library(MapColoring)

my.palette = get_brewer_pal('Set1', 4, plot = FALSE)
nc$color = my.palette[getColoring(as(nc, 'Spatial'))]


2
投票

使用

tmap

library(tmap)
tmap_mode(mode = "view") # if you want an interactive leaflet map
tm_shape(nc) + tm_polygons(col = "MAP_COLORS", minimize = TRUE)

tm_polygons
中,当
col
设置为
"MAP_COLORS"
时:

多边形将被着色,使得相邻的多边形不会获得相同的颜色。详情见底层函数

map_coloring
【来自
tmaptools

来自

?map_coloring
关于
minimize
论点:

逻辑决定算法是否会搜索最少数量的颜色


palette
中使用
tm_polygons
参数来设置首选颜色。

供将来参考,非交互式

ggplot
地图的相关帖子:

使用 ggplot 为地图上的不同相邻区域着色


0
投票

除了上面写的解决方案外,还有以下解决方案: (使用“tmaptools”中的“map_coloring” https://www.rdocumentation.org/packages/tmaptools/versions/3.1-1/topics/map_coloring)

如果由于某种原因所有以前的解决方案都不起作用,您可以“手动”向地图添加颜色。直接设置颜色或使用调色板 (例如使用这个 http://www.cookbook-r.com/Graphs/Colors_(ggplot2)/)。 但是你必须小心,因为托盘的长度可能不够。

因此,作为一个选项,您可以选择,例如,独特的颜色并对其进行排序,然后选择具有一定“步骤”的颜色 (假设颜色是1到10的数字和步骤3,那么选择是可能的: 1、4、7、10、3、6、9、2、5、8)。 或者随机生成一个序列,“重新生成”,直到所有元素都在足够的距离(所有元素之间的步长不大于指定的步长)。

© www.soinside.com 2019 - 2024. All rights reserved.