D3.js如何根据对应数值为地图各区县区域单独设置填充颜色
D3.js 区县地图按数值着色问题及解决
我希望根据每个区县对应的数值,为地图上的不同区域设置不同的填充色。该地图已经拆分为区县板块,我已经拿到了每个区县对应的数值,想要将数值映射为对应的颜色。
我设置的数值范围为[ 40, 19054 ],一开始测试给整个地图设置单一颜色是正常的,比如设置color(19000)可以让整个地图变为红色。
以下是最初尝试实现地图着色的代码:
let topo = json.features let datas = aggCounties d3.json("/counties.json").then(function(json) { function getCountPerKOMKODE() { for (let i = 0; i < topo.length; i++) { for (let j = 0; j < datas.length; j++) { let jsonKOMKODE = json.features[i].properties.KOMKODE; let csvKOMKODE = datas[j].kommune_kode let csvCOUNT = +datas[j].count if (csvKOMKODE == jsonKOMKODE) { return csvCOUNT } } } } let color = d3.scaleQuantize() .domain(d3.extent(getRangeDomain())) .range(["white", "pink", "red"]) let g = svg.append("g"); g.selectAll("path").append("g") .data(topo) .enter() .append('path') .attr('class', 'county') .attr("d", path) .style('fill', color(getCountPerKOMKODE())) });
我当时的疑问是,按查阅的资料,应该可以单独定位到每个path元素,为其应用对应的颜色/数值才对,问题到底出在哪里?
错误原因
核心问题有两处:
- 最初的
getCountPerKOMKODE函数没有传入当前路径对应的区县编码,调用时只会返回第一个匹配到的数值,所有路径共用同一个数值计算颜色,自然只能显示单一颜色 - 给
fill样式赋值时直接执行了颜色计算,仅得到一个固定颜色值应用到所有路径,没有为每个路径单独计算对应数值的映射颜色
最终解决代码
修改后的代码如下,修改后地图已经可以正常按区县对应数值着色:
function getCountPerKOMKODE(path) { for (let j = 0; j < datas.length; j++) { let csvKOMKODE = datas[j].kommune_kode let csvCOUNT = +datas[j].count if (csvKOMKODE == path) { return csvCOUNT } } } g.selectAll("path").append("g") .data(topo) .enter().append('path').attr('class', 'county') .attr("d", path).style('fill', function(d,i) { let komkode = d.properties.KOMKODE return color(getCountPerKOMKODE(komkode)) })
内容的提问来源于stack exchange,提问作者Plewis
相关产品推荐
相关产品推荐

