使用数组计算坐标之间的距离并设置Y轴和刻度 - D3.js
Using arrays to calculate distance between co ordinates and set Y axis and scale - D3.js
我有 x 和 y 坐标,我应该在单个 Y 轴上表示。(我的想法是计算两点之间的距离并表示为 Y 轴。我也有在 X 轴上表示的时间。我尝试了以下方法:但是我如何使用数组来修复 Y 轴刻度?无论如何我可以实现这个吗?请帮助
d3.csv("xxx.csv", function(error, data) {
for (var i=0; i< data.length ; i++)
{
datax[i-2] = Math.sqrt(( data[i].x1 - data[i-1].x1 )* ( data[i].x1 - data[i-1].x1 )
+ ( data[i].y1 - data[i-1].y1 )* ( data[i].y1 - data[i-1].y1 ));
datay[i] = d.Time;
// }
// }
如果我使用以下方式,我无法访问数组的索引元素或使用 'd' 。或者我如何使用下面的方法实现距离计算?
// load data
d3.csv("xxx.csv", function(error, data) {
// change string (from CSV) into number format
data.forEach(function(d) {
d.x1 = +d.x1;
d.y1 = +d.y1;
console.log(d);
});
示例数据:
type studentId 时间 x1 y1 z1 x2 y2 z2 x3 y3
位置 A 106 92 881.42 371.92 1.05 15.93 0 10.4 1
位置 A 106 92.4 893.87 459 1.05 15.84 0 6.2 1
位置 A 106 92.6 898.98 430 1.05 16.01 0 1.41 1
位置 A 106 92.8 900.1 416.94 1.05 16.6 0 356.62 1
位置 A 106 93 904.1 416.94 1.05 16.85 0 353.85 1
位置 A 106 93.2 920 416.94 1.05 16.43 0 354.27 1
位置 A 106 93.4 925 416.94 1.05 16.43 0 354.27 1
您可以使用 forEach
引用数组中的前一个对象。在这里,我新建一个key/value par,命名为distance
,从第二个对象开始(当然第一个对象之前没有记录计算距离):
data.forEach(function(d,i){
if(i>0){
d.distance = Math.sqrt(Math.pow((d.x1 - data[i-1].x1),2)
+ Math.pow((d.y1 - data[i-1].y1),2));
}
});
这是一个演示。在此演示中,我将您的 CSV 更改为 d3.csv
创建的最终对象数组(因为我不能在 SO 片段中使用 CSV 文件):
var data = [{"type":"PositionA","studentId":"106","Time":"92","x1":"881.42","y1":"371.92","z1":"1.05","x2":"15.93","y2":"0","z2":"10.4","x3":"1"},{"type":"PositionA","studentId":"106","Time":"92.4","x1":"893.87","y1":"459","z1":"1.05","x2":"15.84","y2":"0","z2":"6.2","x3":"1"},{"type":"PositionA","studentId":"106","Time":"92.6","x1":"898.98","y1":"430","z1":"1.05","x2":"16.01","y2":"0","z2":"1.41","x3":"1"},{"type":"PositionA","studentId":"106","Time":"92.8","x1":"900.1","y1":"416.94","z1":"1.05","x2":"16.6","y2":"0","z2":"356.62","x3":"1"},{"type":"PositionA","studentId":"106","Time":"93","x1":"904.1","y1":"416.94","z1":"1.05","x2":"16.85","y2":"0","z2":"353.85","x3":"1"},{"type":"PositionA","studentId":"106","Time":"93.2","x1":"920","y1":"416.94","z1":"1.05","x2":"16.43","y2":"0","z2":"354.27","x3":"1"},{"type":"PositionA","studentId":"106","Time":"93.4","x1":"925","y1":"416.94","z1":"1.05","x2":"16.43","y2":"0","z2":"354.27","x3":"1"}];
data.forEach(function(d,i){
if(i>0){
d.x1 = +d.x1;
d.y1 = +d.y1;
d.distance = Math.sqrt(Math.pow((d.x1 - data[i-1].x1),2)
+Math.pow((d.y1 - data[i-1].y1),2));
}
});
console.log(data)
现在,您只需在数据可视化中使用 data
的 属性 distance
。
我有 x 和 y 坐标,我应该在单个 Y 轴上表示。(我的想法是计算两点之间的距离并表示为 Y 轴。我也有在 X 轴上表示的时间。我尝试了以下方法:但是我如何使用数组来修复 Y 轴刻度?无论如何我可以实现这个吗?请帮助
d3.csv("xxx.csv", function(error, data) {
for (var i=0; i< data.length ; i++)
{
datax[i-2] = Math.sqrt(( data[i].x1 - data[i-1].x1 )* ( data[i].x1 - data[i-1].x1 )
+ ( data[i].y1 - data[i-1].y1 )* ( data[i].y1 - data[i-1].y1 ));
datay[i] = d.Time;
// }
// }
如果我使用以下方式,我无法访问数组的索引元素或使用 'd' 。或者我如何使用下面的方法实现距离计算?
// load data
d3.csv("xxx.csv", function(error, data) {
// change string (from CSV) into number format
data.forEach(function(d) {
d.x1 = +d.x1;
d.y1 = +d.y1;
console.log(d);
});
示例数据:
type studentId 时间 x1 y1 z1 x2 y2 z2 x3 y3
位置 A 106 92 881.42 371.92 1.05 15.93 0 10.4 1
位置 A 106 92.4 893.87 459 1.05 15.84 0 6.2 1
位置 A 106 92.6 898.98 430 1.05 16.01 0 1.41 1
位置 A 106 92.8 900.1 416.94 1.05 16.6 0 356.62 1
位置 A 106 93 904.1 416.94 1.05 16.85 0 353.85 1
位置 A 106 93.2 920 416.94 1.05 16.43 0 354.27 1
位置 A 106 93.4 925 416.94 1.05 16.43 0 354.27 1
您可以使用 forEach
引用数组中的前一个对象。在这里,我新建一个key/value par,命名为distance
,从第二个对象开始(当然第一个对象之前没有记录计算距离):
data.forEach(function(d,i){
if(i>0){
d.distance = Math.sqrt(Math.pow((d.x1 - data[i-1].x1),2)
+ Math.pow((d.y1 - data[i-1].y1),2));
}
});
这是一个演示。在此演示中,我将您的 CSV 更改为 d3.csv
创建的最终对象数组(因为我不能在 SO 片段中使用 CSV 文件):
var data = [{"type":"PositionA","studentId":"106","Time":"92","x1":"881.42","y1":"371.92","z1":"1.05","x2":"15.93","y2":"0","z2":"10.4","x3":"1"},{"type":"PositionA","studentId":"106","Time":"92.4","x1":"893.87","y1":"459","z1":"1.05","x2":"15.84","y2":"0","z2":"6.2","x3":"1"},{"type":"PositionA","studentId":"106","Time":"92.6","x1":"898.98","y1":"430","z1":"1.05","x2":"16.01","y2":"0","z2":"1.41","x3":"1"},{"type":"PositionA","studentId":"106","Time":"92.8","x1":"900.1","y1":"416.94","z1":"1.05","x2":"16.6","y2":"0","z2":"356.62","x3":"1"},{"type":"PositionA","studentId":"106","Time":"93","x1":"904.1","y1":"416.94","z1":"1.05","x2":"16.85","y2":"0","z2":"353.85","x3":"1"},{"type":"PositionA","studentId":"106","Time":"93.2","x1":"920","y1":"416.94","z1":"1.05","x2":"16.43","y2":"0","z2":"354.27","x3":"1"},{"type":"PositionA","studentId":"106","Time":"93.4","x1":"925","y1":"416.94","z1":"1.05","x2":"16.43","y2":"0","z2":"354.27","x3":"1"}];
data.forEach(function(d,i){
if(i>0){
d.x1 = +d.x1;
d.y1 = +d.y1;
d.distance = Math.sqrt(Math.pow((d.x1 - data[i-1].x1),2)
+Math.pow((d.y1 - data[i-1].y1),2));
}
});
console.log(data)
现在,您只需在数据可视化中使用 data
的 属性 distance
。