.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可能是受欢迎的。
答案 0 :(得分: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); }); });
您是否尝试为特定地图上色?提前设置颜色方案可能更容易,而不是尝试编写每个客户端运行的算法。
答案 1 :(得分:0)
不,没有这样的实施。在我看来,D3不是最好的实现它,因为它的设计主要假设数据是独立的。