2

Jason Davies 图形着色并没有避免我得到具有相同颜色的邻居多边形。

.style("fill", function(d, i) { return color(d.color = d3.max(neighbors[i], function(n) { return countries[n].color; }) + 1 | 0); });

四色定理:

我们知道 :

四色图定理指出,给定一个平面到相邻区域的任何分离,产生一个称为地图的图形,为地图的区域着色需要不超过四种颜色,因此没有两个相邻区域具有相同的颜色。(维基百科)

四色定理

和:

其次,为了定理的目的,每个“国家”都必须是一个简单连接的区域,或者是连续的。[...] 因为[非毗连国家]的领土必须是同一种颜色,所以四种颜色可能不够。(维基百科)

尽管如此,#D3js 是否有任何类似四色定理的实现/功能,所以我们得到具有不同颜色的邻居多边形?(所以我们不会使用 20 种颜色,因为通常 4-6 种就足够了)

也可以看看:

注意:标签#four-color-theorem 可能会受到欢迎。

4

2 回答 2

1

你介意8种颜色吗?减少可能的颜色数量非​​常简单:

color.range(color.range().slice(0, 8));

http://bl.ocks.org/1wheel/5899035

7 种颜色导致一些相邻国家共享边界。

我还尝试在着色前按邻国数量对国家进行排序;7种颜色仍然不起作用:

var permutation = d3.range(neighbors.length).sort(function(i, j){ 
  return neighbors[j].length - neighbors[i].length; });

countries = d3.permute(countries, permutation);
neighbors = d3.permute(neighbors, permutation)
              .map(function(array){ 
                return array.map(function(d){ 
                  return permutation.indexOf(d); }); });

您是否要为特定地图着色?提前设置配色方案可能比尝试编写每个客户端运行的算法更容易。

于 2013-07-01T08:48:02.457 回答
0

不,没有这样的实现。在我看来,D3 并不是实现它的最佳选择,因为它的设计在很大程度上假设数据是独立的。

于 2013-07-01T08:29:52.007 回答