使用ggplot在地图上对相邻区域进行不同颜色的着色处理

7
我正在尝试使用ggplot在R中制作不同地区的地图,使相邻的地区颜色不同,类似于五色定理所描述的内容。
这里的地区是加利福尼亚县的分组,使用一个数字进行编码(这里是列)。使用ggplot()和geom_map()来为地区着色,使用定性比例尺,最接近的结果如下:
ggplot() + geom_map(data = data, aes(map_id = geoid, fill = as.factor(c20 %% 12)), 
                  map = county) + expand_limits(x = county$long, y = county$lat) +
coord_map(projection="mercator") +
scale_fill_brewer(palette = "Paired") +
geom_text(data = distcenters, aes(x = clong, y = clat, label = cluster, size = 0.2))

问题在于来自不同地区(即带有不同编号的地区)的相邻县有时会具有相同的颜色。例如,在洛杉矶周围,来自33号和45号地区的县是相同颜色的,我们无法在视觉上区分这些地区。
是否有一种使用ggplot的方法可以解决这个问题?

如果您使用更多颜色选择的调色板,是否会得到类似的结果,即一些相邻的县具有相同的颜色?我记得一些酿造者调色板只有有限的颜色,这可能会限制您。 - lawyeR
所以你想要一个着色算法的实现吗?这与ggplot没有任何关系...我已经在Python中为QGIS实现了(相当幼稚的版本)这样的着色算法。“贪婪”算法可能是最简单易懂的,但并不是最优的(在病态情况下有时会出现7种颜色或更多来着色区域)。 - Spacedman
在R中有spdep包用于邻接计算和igraph包用于网络分析。此外,该算法的详细信息可以在http://www.geeksforgeeks.org/graph-coloring-set-2-greedy-algorithm/找到。 - Spacedman
2个回答

3
尝试这个。它需要一个空间多边形数据框,并返回每个元素的颜色向量,使得相邻的两个多边形颜色不同。
您需要先安装spdep软件包。
nacol <- function(spdf){
    resample <- function(x, ...) x[sample.int(length(x), ...)]
    nunique <- function(x){unique(x[!is.na(x)])}
    np = nrow(spdf)
    adjl = spdep::poly2nb(spdf)
    cols = rep(NA, np)
    cols[1]=1
    nextColour = 2

    for(k in 2:np){
        adjcolours = nunique(cols[adjl[[k]]])
        if(length(adjcolours)==0){
            cols[k]=resample(cols[!is.na(cols)],1)
        }else{
            avail = setdiff(nunique(cols), nunique(adjcolours))
            if(length(avail)==0){
                cols[k]=nextColour
                nextColour=nextColour+1
            }else{
                cols[k]=resample(avail,size=1)
            }
        }
    }
    return(cols)
}

测试:

  library(spdep)
  example(columbus)
  columbus$C = nacol(columbus)
  plot(columbus,col=columbus$C+1)

2
这可能有点晚了,但是当我搜索同样的问题时,我找到了一个名为MapColoring的开发包。它正好可以实现你所要求的功能。新名称:"一个可解决这个问题的开发包"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接