向折线图添加新的数据点条目
Adding new data point entries to a line chart
我试图添加新的数据点到图表(data2变量),但不是附加到行,它创建一个新的行。
http://jsfiddle.net/30c8xf9s/你知道吗?
var data = [
{date: "2-May-15", close: 50},
{date: "1-May-15", close: 50},
{date: "30-Apr-15", close: 50},
{date: "27-Apr-15", close: 60},
{date: "26-Apr-15", close: 40},
{date: "25-Apr-15", close: 35},
{date: "24-Apr-15", close: 40},
{date: "23-Apr-15", close: 30},
{date: "20-Apr-15", close: 20},
{date: "19-Apr-15", close: 15},
{date: "15-Apr-15", close: 10}
],
// i want to append this array after 3 seconds.
data2 = [
{date: "15-May-15", close: 35},
{date: "11-May-15", close: 40},
{date: "10-May-15", close: 30},
{date: "5-May-15", close: 20},
{date: "4-May-15", close: 15},
{date: "3-May-15", close: 10}
],
margin = {top: 20, right: 50, bottom: 30, left: 50},
width = 500 - margin.left - margin.right,
height = 950 - margin.top - margin.bottom,
parseDate = d3.time.format("%d-%b-%y").parse,
bisectDate = d3.bisector(function(d) { return d.date; }).left,
formatValue = d3.format(",.2f"),
x = d3.scale.linear()
.range([0, width]),
y = d3.time.scale()
.range([height, 0]),
xAxis = d3.svg.axis()
.scale(x)
.orient("top"),
yAxis = d3.svg.axis()
.scale(y)
.orient("left"),
line = d3.svg.line()
.y(function(d) { return y(d.date); })
.x(function(d) { return x(d.close); })
.interpolate('cardinal'),
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 + ")");
test(data);
setInterval(function(){
test(data2);
}, 1000);
function test(data) {
data.forEach(function(d) {
d.date = parseDate(d.date);
d.close = +d.close;
});
data.sort(function(a, b) {
return a.date - b.date;
});
y.domain([data[0].date, data[data.length - 1].date]);
x.domain(d3.extent(data, function(d) { return d.close; }));
svg.append("g")
.attr("class", "x axis")
.call(xAxis);
svg.append("g")
.attr("class", "y axis")
.call(yAxis);
svg.append("path")
.datum(data)
.attr("class", "line")
.attr("d", line);
};
您没有遵循进入、更新、退出模式。从本质上讲,append
用于输入选择,然后update
用于新数据的现有选择,exit
用于删除数据。您正在重新添加新数据。
根据您编写代码的方式,我发现创建一个与输入test
函数分开的更新函数是最容易的:
function update(data){
// fix data
data.forEach(function(d) {
d.date = parseDate(d.date);
d.close = +d.close;
});
// grab old data and put together
var oldData = d3.select('.line').datum();
data = oldData.concat(data);
// keep it sorted
data.sort(function(a, b) {
return a.date - b.date;
});
// set new domains
y.domain([data[0].date, data[data.length - 1].date]);
x.domain(d3.extent(data, function(d) { return d.close; }));
// update axis BUT DO NOT RE-APPEND
svg.select(".x.axis") // change the x axis
.call(xAxis);
svg.select(".y.axis") // change the y axis
.call(yAxis);
// update line BUT DO NOT RE-APPEND
svg.select('.line')
.datum(data)
.attr('d', line);
}
例子。
相关文章:
- 具有任意多条线的D3折线图(以及特定的数据格式)
- 从数据对象数组创建折线图
- 如何在 D3 中更新我的多折线图数据
- 折线图:对齐多个数据集的x轴(时间戳)
- AngularJS nvd3折线图指令未在数据更改时重新绘制(非实时)
- 用不同的x轴数据集绘制谷歌折线图
- 用谷歌图表json数据绘制简单的折线图,日期在x轴上
- 如何在高图表中传递数据(折线图)
- 如何在高图表中使用系列数据绘制折线图
- Google Charts Javascript,使用两个数组作为折线图的数据输入
- D3js:如何使用 JSON 数据绘制多系列折线图
- 将 XML 数据解析为图表.js折线图
- 在 Chart.js 中使用 addData() 方法将数据添加到折线图
- 如何在D3折线图中禁用X轴上的排序数据
- 谷歌折线图,刷新数据表
- 图表.js折线图,如果数据相同,如何隐藏y轴开始和结束标签
- 当使用 ajax 传递数据时,NVD3 折线图不显示 - data.map 不是一个函数
- 在 flot.js 中绘制折线图和条形图以获取 JSON 数据
- 给定轴上的所有序列必须具有相同的折线图数据类型
- js -使用工具提示数据(折线图)自定义事件