【发布时间】:2013-11-29 09:25:37
【问题描述】:
我想模拟有连续传入的实时(动态)数据并馈送到图表的情况
因此,我尝试用d3来演示一个动画折线图,同时要求数据数组每1秒持续更新一次。
原作灵感来自benjchristensen
这是我修改后的 html 源代码:my source code
我尝试通过调用函数startGenerator() 用random number for every 1 second 填充buffer[100]
function startGenerator()
{
//signalGenerator();
setInterval("signalGenerator()", 1000); //
}
function signalGenerator()
{
var buffer = new Array(100);
var i;
for (i = 0; i < buffer.length; i++)
{
buffer[i] = Math.random() * 10;
}
FeedDataToChart("#graph1", 300, 300, "basis", true, 100, 100, buffer, 0);
}
下面是FeedDataToChart()参数名称:
function FeedDataToChart(id, width, height, interpolation, animate, updateDelay, transitionDelay, data, startIndex)
我使用counter检查重绘数据索引,每次重绘新数据时,counter增加1。在counter < data.length-1 之前,re-draw timer 应该停止并再次从buffer[100] 获取新数据。
function stopTimer()
{
clearInterval(myTimer);
alert("The redraw timer stop here, get new data from buffer");
}
function startTimer()
{
if (myTimer == null)
{
myTimer = setInterval(function() {
if (counter < data.length - 1)
{
var v = data.shift(); // remove the first element of the array
data.push(v); // add a new element to the array (we're just taking the number we just shifted off the front and appending to the end)
if(animate)
{
redrawWithAnimation();
}
else
{
redrawWithoutAnimation();
}
counter++;
}
else
{
alert("no more data in buffer");
stopTimer();
counter = startIndex;
}
}, updateDelay);
}
}
我的问题出现,当我尝试重复 startGenerator() 函数时,结果显示如下:
我对 javascript 很陌生。谁能指出我如何从buffer 每1 second 中提取数据并不断更新单线图表?
谢谢!
EDIT我更新了源,问题已经最小化:My New Source
我在stopTimer() 处添加.remove() 行以删除sgv 持有的数据并重置global buffer to null 并再次调用startGenerator() 函数以在计时器停止时提取新数据。
现在我遇到的唯一问题是,每次创建新图时,它都会在前一个图的下方创建一个新的 sgv 路径。每次创建新图表时,它都会向下移动。检查我今天更新的新来源。运行代码后,您将看到我的描述。
如何在每次更新时将 sgv 路径固定在同一位置?
【问题讨论】:
-
对我来说很好——jsfiddle.net/7RfVG
-
你试图取消注释 setInterval("signalGenerator()", 1000);并再次运行代码。
-
我明白你的意思,但我不清楚你想做什么。您只是想为同一行生成更多数据吗?
-
是的,你是对的。我想为同一行生成更多数据并连续为其设置动画。
-
你能用同样的函数生成更多的数据吗?是否需要多次调用该函数?
标签: javascript animation charts d3.js svg-animate