Javascript 如何缩放d3.js图表并以更大的粒度重新加载数据(在AJAX中)
当我缩放图表时,我需要用一个新的数据块(AJAX查询)替换一些数据 但我无法在没有旧点和更新线路径的情况下与原始数据合并 看Javascript 如何缩放d3.js图表并以更大的粒度重新加载数据(在AJAX中),javascript,arrays,merge,d3.js,zooming,Javascript,Arrays,Merge,D3.js,Zooming,当我缩放图表时,我需要用一个新的数据块(AJAX查询)替换一些数据 但我无法在没有旧点和更新线路径的情况下与原始数据合并 看 //替换或添加部分数据 功能缩放(g){ var data2add=[//通过ajax查询获取新数据 {“日期”:“2013-05-02T20:00”,“速度”:0.878,“角度”:269,“x”:-0.725,“y”:-0.018}, ... ]; 日志(“数据”,数据,“数据添加”,数据添加); data2add=data2add.map(函数(d,i){ 返回{
//替换或添加部分数据
功能缩放(g){
var data2add=[//通过ajax查询获取新数据
{“日期”:“2013-05-02T20:00”,“速度”:0.878,“角度”:269,“x”:-0.725,“y”:-0.018},
...
];
日志(“数据”,数据,“数据添加”,数据添加);
data2add=data2add.map(函数(d,i){
返回{
日期:平均日期调用(数据,d,i),
速度:速度呼叫(数据,d,i),
角度:角度调用(数据,d,i),
xSpeed:xSpeed.call(data,d,i),
ySpeed:ySpeed.call(数据,d,i)
};
});
data=data.filter(函数(元素、索引、数组){
返回(element.date data2add[data2add.length-1].date);
})
.排序(功能(a、b){
返回a.日期-b.日期;
})
.concat(data2add);console.log(“newData”,data);
d3.选择All(“path.line”).data(data.enter();
g、 选择全部('circle')。数据(data)。输入()。追加(“circle”)
.attr(“类”、“点”);
g、 updateCurve()
.drawAxis();
}
问题在于使用.concat()
。它合并了阵列,而不需要指出任何点。相反,您应该做什么取决于您试图对数据做什么。如果您想删除所有旧的点,只需使用data2add
覆盖data
如果要添加新数据,然后保留一定范围的旧数据,可以在.concat()
之前对旧数组使用.filter()
。只需创建一个过滤函数,检查元素是否既在您的范围内,又不等于其他数组中的任何元素。这将类似于以下内容:
function filterFunction(value, i, thisArray){
//Check to see if point is in range
if(value < maxRange && value > minRange){
//Note that you might have to change this depending on how 'equal'
//your elements are. You could also iterate through and check the dates, for
//example.
return (newDataArray.indexOf(value) > -1 ? 0 : 1)
}
return 0;
}
function filterFunction(值,i,此数组){
//检查点是否在范围内
if(值minRange){
//请注意,您可能需要根据“相等”的程度进行更改
//您的元素是。您还可以遍历并检查日期,例如
//例如。
返回值(newDataArray.indexOf(value)>-1?0:1)
}
返回0;
}
用于缩放和更新包含缩放数据的折线图:
this.select(“path.line”).attr(“d”,line)代码>
g.updateCurve = function(_){
// Update the line path.
this.select("path.line")
.attr("d", line(_));
// add each point
this.selectAll('circle.dot')
.attr("cx", function(d) {return xScale (d.date); })
.attr("cy", function(d) {return yScale (d.ySpeed); })
.attr("r", function(d) {return rScale (d.xSpeed)*2; });
return this;
};
用于绘制和重新绘制轴
g.drawAxis = function(){
// Update the x-axis.
g.select(".x.axis")
.attr("transform", "translate(0," + xPos + ")")
.call(xAxis);
g.select(".y.axis")
.attr("transform", "translate(0,0)")
.call(yAxis);
return this;
};
用于缩放和替换部分数据
function zoom(g) {
var data2add=[
{"date":"2013-05-02T20:00","speed":0.878,"angle":269,"x":-0.725,"y":-0.018},
...
];
data2add = data2add.map(function(d, i) {
return {
date:meanDate.call(data, d, i),
Speed:Speed.call(data, d, i),
angle:angle.call(data, d, i),
xSpeed:xSpeed.call(data, d, i),
ySpeed:ySpeed.call(data, d, i)
};
});
mergedata = data.filter(function(element, index, array){
return (element.date<data2add[0].date || element.date>data2add[data2add.length-1].date);
})
.concat(data2add)
.sort(function (a, b) {
return a.date-b.date;
});
// .sortBy( function(){ return this.date } ); // http://phrogz.net/JS/Array.prototype.sortBy.js
var newDots = g.selectAll('circle')
// define new [data]
.data(mergedata, function(d) { return d.date; });
newDots.exit().remove(); // exit() content the deprecated points, remove it
newDots.enter().append("circle")// enter() content the new points, draw it
.attr("class", "dot");
g.updateCurve()
.drawAxis ();
}
功能缩放(g){
var data2add=[
{“日期”:“2013-05-02T20:00”,“速度”:0.878,“角度”:269,“x”:-0.725,“y”:-0.018},
...
];
data2add=data2add.map(函数(d,i){
返回{
日期:平均日期调用(数据,d,i),
速度:速度呼叫(数据,d,i),
角度:角度调用(数据,d,i),
xSpeed:xSpeed.call(data,d,i),
ySpeed:ySpeed.call(数据,d,i)
};
});
mergedata=data.filter(函数(元素、索引、数组){
返回(element.datedata2add[data2add.length-1].date);
})
.concat(data2add)
.排序(功能(a、b){
返回a.date-b.date;
});
//.sortBy(函数(){return this.date});//http://phrogz.net/JS/Array.prototype.sortBy.js
var newDots=g.selectAll('圆')
//定义新的[数据]
.data(合并数据,函数(d){返回d.date;});
newDots.exit().remove();//exit()内容不推荐使用的点,将其删除
newDots.enter().append(“circle”)//enter()为新点添加内容,绘制它
.attr(“类”、“点”);
g、 updateCurve()
.drawAxis();
}
可以进行过滤,但您有没有用新值更新折线图的想法?我建议使用日期作为数据键,并使用标准的d3进入/退出/更新模式来移动内容。我通常使用刻度设置cx、cy等,然后转换到新位置。如果我已经加载了所有数据。是否有一种简单的方法,在查看器缩放之前,只显示减少的数据样本。更具体地说,一次只能智能地显示X个数据点。问题是,当我绘制所有数据点时,图形变得没有响应。只是一个提示,这是错误的,因为线在跳跃。
function zoom(g) {
var data2add=[
{"date":"2013-05-02T20:00","speed":0.878,"angle":269,"x":-0.725,"y":-0.018},
...
];
data2add = data2add.map(function(d, i) {
return {
date:meanDate.call(data, d, i),
Speed:Speed.call(data, d, i),
angle:angle.call(data, d, i),
xSpeed:xSpeed.call(data, d, i),
ySpeed:ySpeed.call(data, d, i)
};
});
mergedata = data.filter(function(element, index, array){
return (element.date<data2add[0].date || element.date>data2add[data2add.length-1].date);
})
.concat(data2add)
.sort(function (a, b) {
return a.date-b.date;
});
// .sortBy( function(){ return this.date } ); // http://phrogz.net/JS/Array.prototype.sortBy.js
var newDots = g.selectAll('circle')
// define new [data]
.data(mergedata, function(d) { return d.date; });
newDots.exit().remove(); // exit() content the deprecated points, remove it
newDots.enter().append("circle")// enter() content the new points, draw it
.attr("class", "dot");
g.updateCurve()
.drawAxis ();
}