平滑 D3 中的 arcs/plot 点。js/GeoJSON/TopoJSON/Shapefile(沿途某处)
Smoothing arcs/plot points in D3.js/GeoJSON/TopoJSON/Shapefile (somewhere along the way)
我一直在寻找这个问题的答案,但一直没弄明白。
- 我最终要从基于网格的数据(GRIB 文件)创建一个 TopoJSON 文件。
- 我可以很容易地将数据插入到更精细的分辨率网格中,这样绘图点 在缩小时看起来 更平滑,但在放大时,不可避免地会看到块状网格点.
- 我也研究了简化,这确实有点帮助,但不是很平滑。
- 我正在使用 D3 呈现数据。
- 这是可以在前端完成还是should/can可以在原始 TopoJSON 数据中完成?
- 我基本上不希望您能够看出它是一个网格,即使您放大 10,000%。
- 这是我所追求的示例:
也许 d3 line.interpolate() 就是您要找的东西?
更多信息:
http://www.d3noob.org/2013/01/smoothing-out-lines-in-d3js.html
如果您正在使用 D3.js,并且您正在处理直线,则内置的 interpolate() 函数是最佳选择。
这是 D3 的 line.interpolate() 使用 "cardinal" 平滑的工作示例:
http://codepen.io/gracefulcode/pen/doPmOK
代码如下:
var margin = {
top: 30,
right: 20,
bottom: 30,
left: 50
},
width = 600 - margin.left - margin.right,
height = 270 - margin.top - margin.bottom;
// Parse the date / time
var parseDate = d3.time.format("%d-%b-%y").parse;
// Set the ranges
var x = d3.time.scale().range([0, width]);
var y = d3.scale.linear().range([height, 0]);
// Define the axes
var xAxis = d3.svg.axis().scale(x).orient("bottom").ticks(5);
var yAxis = d3.svg.axis().scale(y).orient("left").ticks(5);
// Define the line
var valueline = d3.svg.line()
.interpolate("cardinal")
.x(function(d) {
return x(d.date);
})
.y(function(d) {
return y(d.close);
});
// Adds the svg canvas
var svg = d3.select("body").append("svg")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
.append("g")
.attr("transform",
"translate(" + margin.left + "," + margin.top + ")");
// Get the data
d3.json('https://api.myjson.com/bins/175jl', function(error, data) {
data.forEach(function(d) {
d.date = parseDate(d.date);
d.close = +d.close;
});
// Scale the range of the data
// Starting with a basic graph 14
x.domain(d3.extent(data, function(d) {
return d.date;
}));
y.domain([0, d3.max(data, function(d) {
return d.close;
})]);
// Add the valueline path.
svg.append("path")
.attr("class", "line")
.attr("d", valueline(data));
// Add the X Axis
svg.append("g")
.attr("class", "x axis")
.attr("transform", "translate(0," + height + ")")
.call(xAxis);
// Add the Y Axis
svg.append("g")
.attr("class", "y axis")
.call(yAxis);
});
Is this something that can be done on the front end or should/can it be done in the raw TopoJSON data?
这是前端应该做的事情。如果在将数据写入 JSON 文件之前对数据进行平滑处理,则文件会大得不必要。
我一直在寻找这个问题的答案,但一直没弄明白。
- 我最终要从基于网格的数据(GRIB 文件)创建一个 TopoJSON 文件。
- 我可以很容易地将数据插入到更精细的分辨率网格中,这样绘图点 在缩小时看起来 更平滑,但在放大时,不可避免地会看到块状网格点.
- 我也研究了简化,这确实有点帮助,但不是很平滑。
- 我正在使用 D3 呈现数据。
- 这是可以在前端完成还是should/can可以在原始 TopoJSON 数据中完成?
- 我基本上不希望您能够看出它是一个网格,即使您放大 10,000%。
- 这是我所追求的示例:
也许 d3 line.interpolate() 就是您要找的东西?
更多信息: http://www.d3noob.org/2013/01/smoothing-out-lines-in-d3js.html
如果您正在使用 D3.js,并且您正在处理直线,则内置的 interpolate() 函数是最佳选择。
这是 D3 的 line.interpolate() 使用 "cardinal" 平滑的工作示例:
http://codepen.io/gracefulcode/pen/doPmOK
代码如下:
var margin = {
top: 30,
right: 20,
bottom: 30,
left: 50
},
width = 600 - margin.left - margin.right,
height = 270 - margin.top - margin.bottom;
// Parse the date / time
var parseDate = d3.time.format("%d-%b-%y").parse;
// Set the ranges
var x = d3.time.scale().range([0, width]);
var y = d3.scale.linear().range([height, 0]);
// Define the axes
var xAxis = d3.svg.axis().scale(x).orient("bottom").ticks(5);
var yAxis = d3.svg.axis().scale(y).orient("left").ticks(5);
// Define the line
var valueline = d3.svg.line()
.interpolate("cardinal")
.x(function(d) {
return x(d.date);
})
.y(function(d) {
return y(d.close);
});
// Adds the svg canvas
var svg = d3.select("body").append("svg")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
.append("g")
.attr("transform",
"translate(" + margin.left + "," + margin.top + ")");
// Get the data
d3.json('https://api.myjson.com/bins/175jl', function(error, data) {
data.forEach(function(d) {
d.date = parseDate(d.date);
d.close = +d.close;
});
// Scale the range of the data
// Starting with a basic graph 14
x.domain(d3.extent(data, function(d) {
return d.date;
}));
y.domain([0, d3.max(data, function(d) {
return d.close;
})]);
// Add the valueline path.
svg.append("path")
.attr("class", "line")
.attr("d", valueline(data));
// Add the X Axis
svg.append("g")
.attr("class", "x axis")
.attr("transform", "translate(0," + height + ")")
.call(xAxis);
// Add the Y Axis
svg.append("g")
.attr("class", "y axis")
.call(yAxis);
});
Is this something that can be done on the front end or should/can it be done in the raw TopoJSON data?
这是前端应该做的事情。如果在将数据写入 JSON 文件之前对数据进行平滑处理,则文件会大得不必要。