D3js 图例颜色与地图颜色不匹配 javascript
D3js legend color does not match to the map color javascript
我已经画好了地图。我想使用 d3.js 添加图例。例如,按长度归档时,地图应显示不同的颜色。一个星期以来,我无法完成这项任务。我的地图颜色似乎不错,但图例不匹配。
有人可以帮助我绘制 link 函数吗?
https://jsfiddle.net/aba2s/xbn9euh0/12/)
我认为是关于图例函数的错误。
这是改变我的地图颜色的函数 Roads.eachLayer(function (layer) {layer.setStyle({fillColor: colorscale(layer.feature.properties.length)})});
function drawLinkLegend(dataset, colorscale, min, max) {
// Show label
linkLabel.style.display = 'block'
var legendWidth = 100
legendMargin = 10
legendLength = document.getElementById('legend-links-container').offsetHeight - 2*legendMargin
legendIntervals = Object.keys(colorscale).length
legendScale = legendLength/legendIntervals
// Add legend
var legendSvg = d3.select('#legend-links-svg')
.append('g')
.attr("id", "linkLegendSvg");
var bars = legendSvg.selectAll(".bars")
//.data(d3.range(legendIntervals), function(d) { return d})
.data(dataset)
.enter().append("rect")
.attr("class", "bars")
.attr("x", 0)
.attr("y", function(d, i) { return legendMargin + legendScale * (legendIntervals - i-1); })
.attr("height", legendScale)
.attr("width", legendWidth-50)
.style("fill", function(d) { return colorscale(d) })
// create a scale and axis for the legend
var legendAxis = d3.scaleLinear()
.domain([min, max])
.range([legendLength, 0]);
legendSvg.append("g")
.attr("class", "legend axis")
.attr("transform", "translate(" + (legendWidth - 50) + ", " + legendMargin + ")")
.call(d3.axisRight().scale(legendAxis).ticks(10))
}
D3 期望您的数据数组代表您正在创建的元素。看起来您正在传递所有功能的数组:但您希望您的比例代表间隔。看起来你已经尝试过这种方法,但你还没有完全掌握它。
我们想要访问将提供给秤的最小值和最大值。为此,我们可以使用 scale.domain()
其中 returns 包含域范围、最小值和最大值的数组。
然后我们可以创建一个数据集,其中包含这两个端点之间(包括)之间的值。
最后,我们可以根据视觉尺度的高度除以values/intervals的数量来计算他们需要的高度。
然后我们可以将此信息提供给 enter/update/exit 循环。 enter/update/exit 循环需要数据数组中的一项用于选择中的每个元素 - 因此为什么需要创建一个新数据集。
类似于下面的 shold 作品:
var dif = colorscale.domain()[1] - colorscale.domain()[0];
var intervals = d3.range(20).map(function(d,i) {
return dif * i / 20 + colorscale.domain()[0]
})
intervals.push(colorscale.domain()[1]);
var intervalHeight = legendLength / intervals.length;
var bars = legendSvg.selectAll(".bars")
.data(intervals)
.enter().append("rect")
.attr("class", "bars")
.attr("x", 0)
.attr("y", function(d, i) { return Math.round((intervals.length - 1 - i) * intervalHeight) + legendMargin; })
.attr("height", intervalHeight)
.attr("width", legendWidth-50)
.style("fill", function(d, i) { return colorscale(d) })
在对现有代码进行故障排除时,您会发现 DOM 中表示比例时元素过多。此外,Object.keys(colorscale).length
不会生成对生成间隔有用的信息 - 比例键不依赖于数据。
我已经画好了地图。我想使用 d3.js 添加图例。例如,按长度归档时,地图应显示不同的颜色。一个星期以来,我无法完成这项任务。我的地图颜色似乎不错,但图例不匹配。 有人可以帮助我绘制 link 函数吗? https://jsfiddle.net/aba2s/xbn9euh0/12/)
我认为是关于图例函数的错误。
这是改变我的地图颜色的函数 Roads.eachLayer(function (layer) {layer.setStyle({fillColor: colorscale(layer.feature.properties.length)})});
function drawLinkLegend(dataset, colorscale, min, max) {
// Show label
linkLabel.style.display = 'block'
var legendWidth = 100
legendMargin = 10
legendLength = document.getElementById('legend-links-container').offsetHeight - 2*legendMargin
legendIntervals = Object.keys(colorscale).length
legendScale = legendLength/legendIntervals
// Add legend
var legendSvg = d3.select('#legend-links-svg')
.append('g')
.attr("id", "linkLegendSvg");
var bars = legendSvg.selectAll(".bars")
//.data(d3.range(legendIntervals), function(d) { return d})
.data(dataset)
.enter().append("rect")
.attr("class", "bars")
.attr("x", 0)
.attr("y", function(d, i) { return legendMargin + legendScale * (legendIntervals - i-1); })
.attr("height", legendScale)
.attr("width", legendWidth-50)
.style("fill", function(d) { return colorscale(d) })
// create a scale and axis for the legend
var legendAxis = d3.scaleLinear()
.domain([min, max])
.range([legendLength, 0]);
legendSvg.append("g")
.attr("class", "legend axis")
.attr("transform", "translate(" + (legendWidth - 50) + ", " + legendMargin + ")")
.call(d3.axisRight().scale(legendAxis).ticks(10))
}
D3 期望您的数据数组代表您正在创建的元素。看起来您正在传递所有功能的数组:但您希望您的比例代表间隔。看起来你已经尝试过这种方法,但你还没有完全掌握它。
我们想要访问将提供给秤的最小值和最大值。为此,我们可以使用 scale.domain()
其中 returns 包含域范围、最小值和最大值的数组。
然后我们可以创建一个数据集,其中包含这两个端点之间(包括)之间的值。
最后,我们可以根据视觉尺度的高度除以values/intervals的数量来计算他们需要的高度。
然后我们可以将此信息提供给 enter/update/exit 循环。 enter/update/exit 循环需要数据数组中的一项用于选择中的每个元素 - 因此为什么需要创建一个新数据集。
类似于下面的 shold 作品:
var dif = colorscale.domain()[1] - colorscale.domain()[0];
var intervals = d3.range(20).map(function(d,i) {
return dif * i / 20 + colorscale.domain()[0]
})
intervals.push(colorscale.domain()[1]);
var intervalHeight = legendLength / intervals.length;
var bars = legendSvg.selectAll(".bars")
.data(intervals)
.enter().append("rect")
.attr("class", "bars")
.attr("x", 0)
.attr("y", function(d, i) { return Math.round((intervals.length - 1 - i) * intervalHeight) + legendMargin; })
.attr("height", intervalHeight)
.attr("width", legendWidth-50)
.style("fill", function(d, i) { return colorscale(d) })
在对现有代码进行故障排除时,您会发现 DOM 中表示比例时元素过多。此外,Object.keys(colorscale).length
不会生成对生成间隔有用的信息 - 比例键不依赖于数据。