d3.js 线性刻度 returns NaN
d3.js linear scale returns NaN
我正在尝试使用 d3.js 构建我的第一个可视化效果,但我遇到了来自 JSON 来源 (myData
) 的缩放数据问题。这就是我缩放它并创建 svg 圆圈的方式:
var myData = [{
"x": "45.4969717",
"y": "10.605375399999957"
}, {
"x": "45.4847328802866",
"y": "9.236798286437988"
}, {
"x": "45.4838657",
"y": "9.25125330000003"
}]
var xline = d3.scaleLinear().domain(45.103300, 40.1053737).range([0, 450.57913]);
var yline = d3.scaleLinear().domain(12.186311, 12.605783).range([0, 350]);
var svgViewport = d3.select("#mappa-italia").append("g").attr("id", "locations");
var circleElements = svgViewport.selectAll("circle").data(myData).enter().append("circle").attr("cx", function(d) {
return xline(d.x);
}).attr("cy", function(d) {
return yline(d.y);
}).attr("r", "5");
<script src="https://d3js.org/d3.v5.min.js"></script>
<svg id="mappa-italia"></svg>
控制台返回的错误是:
Error: <circle> attribute cx: Expected length, "NaN".
Error: <circle> attribute cy: Expected length, "NaN".
我正在使用 d3.js 版本 5
域需要是一个数组,所以:
var xline = d3.scaleLinear().domain([45.103300,40.1053737]).range([0,450.57913]);
var yline = d3.scaleLinear().domain([12.186311,12.605783]).range([0,350]);
不建议使用静态值设置域。以下是您要查找的内容的类似示例:
https://bl.ocks.org/mbostock/3887118
使用以下更改:
将宽度、高度、边距定义为变量。
var margin = {top: 10, bottom: 10, left: 10, right: 10},
width = 600-margin.left-margin.right,
height = 400-margin.top-margin.bottom;
线性刻度返回 NaN 的原因是因为数据值 (x & y) 是字符串而不是数字。要解析数据,这里有一种方法:
// parse data
myData.forEach(function(d) {
d.x = +d.x;
d.y = +d.y;
});
重要建议:避免在设置轴域时使用静态值。利用 d3 array manipulations-min,max,extent. I'm using d3-extent
var xline = d3.scaleLinear().domain(d3.extent(myData, function(d) { return d.x; })).nice().range([0, width]);
var yline = d3.scaleLinear().domain(d3.extent(myData, function(d) { return d.y; })).nice().range([height, 0]);
由于数据现在已被解析(第 2 步),线性比例绘制值不会有问题。
var circleElements = svgViewport.selectAll("circle").data(myData).enter().append("circle").attr("cx", function(d) {
return xline(d.x);
}).attr("cy", function(d) {
return yline(d.y);
})
为了美观,我使用色标为圆圈添加颜色:
var colorScale = d3.scaleOrdinal(d3.schemeCategory10);
这是一个代码片段:
var myData = [{
"x": "45.4969717",
"y": "10.605375399999957"
}, {
"x": "45.4847328802866",
"y": "9.236798286437988"
}, {
"x": "42.4838657",
"y": "9.25125330000003",
}, {
"x": "40.1053737",
"y": "12"
}, {
"x": "42.4",
"y": "10.4"
}];
var margin = {top: 10, bottom: 10, left: 10, right: 10},
width = 450.57913-margin.left-margin.right,
height = 350-margin.top-margin.bottom;
// parse data
myData.forEach(function(d) {
d.x = +d.x;
d.y = +d.y;
});
var xline = d3.scaleLinear().domain(d3.extent(myData, function(d) { return d.x; })).nice().range([0, width]);
var yline = d3.scaleLinear().domain(d3.extent(myData, function(d) { return d.y; })).nice().range([height, 0]);
var colorScale = d3.scaleOrdinal(d3.schemeCategory10);
var svgViewport = d3.select("#mappa-italia")
.attr('width', width+margin.left+margin.right)
.attr('height', height+margin.top+margin.bottom)
.append("g")
.attr('transform', 'translate('+margin.left+', ' + margin.top+')')
.attr("id", "locations");
var circleElements = svgViewport.selectAll("circle").data(myData).enter().append("circle").attr("cx", function(d) {
return xline(d.x);
}).attr("cy", function(d) {
return yline(d.y);
}).attr("r", "5").style('fill', function(d, i) {
return colorScale(i);
});
<script src="https://d3js.org/d3.v5.min.js"></script>
<svg id="mappa-italia"></svg>
希望这对您有所帮助。 (顺便说一句,我在数据中添加了几行)
我正在尝试使用 d3.js 构建我的第一个可视化效果,但我遇到了来自 JSON 来源 (myData
) 的缩放数据问题。这就是我缩放它并创建 svg 圆圈的方式:
var myData = [{
"x": "45.4969717",
"y": "10.605375399999957"
}, {
"x": "45.4847328802866",
"y": "9.236798286437988"
}, {
"x": "45.4838657",
"y": "9.25125330000003"
}]
var xline = d3.scaleLinear().domain(45.103300, 40.1053737).range([0, 450.57913]);
var yline = d3.scaleLinear().domain(12.186311, 12.605783).range([0, 350]);
var svgViewport = d3.select("#mappa-italia").append("g").attr("id", "locations");
var circleElements = svgViewport.selectAll("circle").data(myData).enter().append("circle").attr("cx", function(d) {
return xline(d.x);
}).attr("cy", function(d) {
return yline(d.y);
}).attr("r", "5");
<script src="https://d3js.org/d3.v5.min.js"></script>
<svg id="mappa-italia"></svg>
控制台返回的错误是:
Error: <circle> attribute cx: Expected length, "NaN".
Error: <circle> attribute cy: Expected length, "NaN".
我正在使用 d3.js 版本 5
域需要是一个数组,所以:
var xline = d3.scaleLinear().domain([45.103300,40.1053737]).range([0,450.57913]);
var yline = d3.scaleLinear().domain([12.186311,12.605783]).range([0,350]);
不建议使用静态值设置域。以下是您要查找的内容的类似示例:
https://bl.ocks.org/mbostock/3887118
使用以下更改:
将宽度、高度、边距定义为变量。
var margin = {top: 10, bottom: 10, left: 10, right: 10}, width = 600-margin.left-margin.right, height = 400-margin.top-margin.bottom;
线性刻度返回 NaN 的原因是因为数据值 (x & y) 是字符串而不是数字。要解析数据,这里有一种方法:
// parse data myData.forEach(function(d) { d.x = +d.x; d.y = +d.y; });
重要建议:避免在设置轴域时使用静态值。利用 d3 array manipulations-min,max,extent. I'm using d3-extent
var xline = d3.scaleLinear().domain(d3.extent(myData, function(d) { return d.x; })).nice().range([0, width]); var yline = d3.scaleLinear().domain(d3.extent(myData, function(d) { return d.y; })).nice().range([height, 0]);
由于数据现在已被解析(第 2 步),线性比例绘制值不会有问题。
var circleElements = svgViewport.selectAll("circle").data(myData).enter().append("circle").attr("cx", function(d) { return xline(d.x); }).attr("cy", function(d) { return yline(d.y); })
为了美观,我使用色标为圆圈添加颜色:
var colorScale = d3.scaleOrdinal(d3.schemeCategory10);
这是一个代码片段:
var myData = [{
"x": "45.4969717",
"y": "10.605375399999957"
}, {
"x": "45.4847328802866",
"y": "9.236798286437988"
}, {
"x": "42.4838657",
"y": "9.25125330000003",
}, {
"x": "40.1053737",
"y": "12"
}, {
"x": "42.4",
"y": "10.4"
}];
var margin = {top: 10, bottom: 10, left: 10, right: 10},
width = 450.57913-margin.left-margin.right,
height = 350-margin.top-margin.bottom;
// parse data
myData.forEach(function(d) {
d.x = +d.x;
d.y = +d.y;
});
var xline = d3.scaleLinear().domain(d3.extent(myData, function(d) { return d.x; })).nice().range([0, width]);
var yline = d3.scaleLinear().domain(d3.extent(myData, function(d) { return d.y; })).nice().range([height, 0]);
var colorScale = d3.scaleOrdinal(d3.schemeCategory10);
var svgViewport = d3.select("#mappa-italia")
.attr('width', width+margin.left+margin.right)
.attr('height', height+margin.top+margin.bottom)
.append("g")
.attr('transform', 'translate('+margin.left+', ' + margin.top+')')
.attr("id", "locations");
var circleElements = svgViewport.selectAll("circle").data(myData).enter().append("circle").attr("cx", function(d) {
return xline(d.x);
}).attr("cy", function(d) {
return yline(d.y);
}).attr("r", "5").style('fill', function(d, i) {
return colorScale(i);
});
<script src="https://d3js.org/d3.v5.min.js"></script>
<svg id="mappa-italia"></svg>
希望这对您有所帮助。 (顺便说一句,我在数据中添加了几行)