按设置的时间间隔从现有数据表更新数据点
Update Data Point From Existing DataTable On Set Interval
我想让HighChart通过将下一个数据点添加到图表来更新序列,以便图表"播放"。我有一个同时包含 X 和 Y 分量的数据系列。我希望图表更新(比如每秒)与本系列的下一个点。我正在使用DotNet.HighCharts API在 VB.NET 4站点中使用它。我已经跟进了几个演示(例如这个),所有这些演示都使用了一些随机生成的值。如何让图表使用现有的一组点?这是一个使用随机函数的 jsFiddle - http://jsfiddle.net/tQpNN/3/我只是不知道如何遍历传入的数据系列(如果这是这样做的方法)或让 DotNet.HighCharts 为我迭代。
用一些代码编辑:
Dim stfipsList4 = (From r In dt4.AsEnumerable() Select r("areaname")).Distinct().ToList()
Dim SeriesList4 As New List(Of Series)(stfipsList4.Count)
Dim seriesItem4(stfipsList4.Count) As Series
Dim xDate4 As DateTime
Dim fakeDate4 As String
Dim sX4 As Integer
sX4 = 1
For Each state In stfipsList4
Dim data As New Dictionary(Of DateTime, Decimal)
Dim stateVal As String = state.ToString
Dim recCount As Integer = dt4.Rows.Count - 1
Dim seriesPointCount As Integer = dt4.Compute("Count(population)", "areaname = '" + stateVal + "'")
Dim chartData As Object(,) = New Object(seriesPointCount - 1, 1) {}
Dim x As Integer = 0
For i As Integer = 0 To recCount
If dt4.Rows(i)("areaname").ToString = stateVal Then
fakeDate4 = "1/1/" + dt4.Rows(i)("periodyear").ToString
xDate3 = DateTime.Parse(fakeDate4)
chartData.SetValue(xDate4.Date, x, 0)
chartData.SetValue(dt4.Rows(i)("population"), x, 1)
x += 1
End If
Next
seriesItem4(sX4) = New Series With {
.Name = state.ToString, _
.Data = New Helpers.Data(chartData)
}
SeriesList4.Add(seriesItem3(sX4))
sX4 = sX4 + 1
Next
Dim iterateData As String = JsonSerializer.Serialize(New Helpers.Data(New Object() {seriesItem3(1).Data}))
Dim chart4 As Highcharts = New Highcharts("chart4").SetOptions(New Helpers.GlobalOptions() With { _
.[Global] = New [Global]() With { _
.UseUTC = False _
} _
}).InitChart(New Chart() With { _
.DefaultSeriesType = ChartTypes.Spline, _
.MarginRight = 10, _
.Events = New ChartEvents() With { _
.Load = "ChartEventsLoad" _
} _
}).SetTitle(New Title() With { _
.Text = "Live data" _
}).SetXAxis(New XAxis() With { _
.Type = AxisTypes.Datetime, _
.TickPixelInterval = 150 _
}).SetSeries(New Series() With { _
.Data = New Helpers.Data(New Object() {})
}) _
.AddJavascripVariable("counter", "0") _
.AddJavascripVariable("stockData", iterateData) _
.AddJavascripFunction("ChartEventsLoad", "// set up the updating of the chart each second" & vbCr & vbLf & _
" var series = this.series[0];" & vbCr & vbLf & _
" setInterval(function() {" & vbCr & vbLf & _
" var x = stockData[counter].key;" & vbCr & vbLf & _
" var y = stockData[counter].value;" & vbCr & vbLf & _
" series.addPoint([x, y], true, series.points.length > 10);" & vbCr & vbLf & _
" counter++;" & vbCr & vbLf & _
"}, 1000);")
这在我的一系列数据中传递(可以是 1 个或多个不同的单个系列)。我想做的是通过一次添加一个点来"播放"系列点(缩放 x 轴,但我不想删除任何点)。这个虚拟版本只是在给定的时刻添加了一个新的随机 y 值。我不确定如何迭代现有数据。
这确实将"stockData"javascript var设置为我的数据集。我在FireBug中看到错误,指出
股票数据[计数器] 未定义
变量counter
与stockdata
和chart4
图一起在$(document).ready(function)
中定义。请参阅 http://jsfiddle.net/ZvYT6/了解 DotNet.Highcharts API 吐出的内容。迭代的内联 javascript 如下所示:
function ChartEventsLoad(){
// set up the updating of the chart each second
var series = this.series[0];
setInterval(function() {
var x = stockData[counter].key;
var y = stockData[counter].value;
series.addPoint([x, y], true, series.points.length > 10);
counter++;
}, 1000);
}
});
我真正不确定的部分是键/值stockData[counter]
。这在javascript中叫什么?股票数据是一个数据列表,如下所示:
var stockData = { data: [{ data: [[Date.parse('01/01/1900 00:00:00'), 530000],
....,
[Date.parse('01/01/2010 00:00:00'), 18801310]]
}]
};
编辑 v4:好的,现在我能够使用一些讨厌的javascript解析出我的数据数组。
Dim iterateData As String = JsonSerializer.Serialize(seriesItem3(1))
Dim chart4 As Highcharts = New Highcharts("chart4").SetOptions(New Helpers.GlobalOptions() With { _
.[Global] = New [Global]() With { _
.UseUTC = False _
} _
}).InitChart(New Chart() With { _
.DefaultSeriesType = ChartTypes.Spline, _
.MarginRight = 10, _
.Events = New ChartEvents() With { _
.Load = "ChartEventsLoad" _
} _
}).SetTitle(New Title() With { _
.Text = "Live data" _
}).SetXAxis(New XAxis() With { _
.Type = AxisTypes.Datetime, _
.TickPixelInterval = 150 _
}).SetSeries(New Series() With { _
.Data = New Helpers.Data(New Object() {})
}) _
.AddJavascripVariable("counter", "0") _
.AddJavascripVariable("stockData", iterateData.ToString) _
.AddJavascripFunction("ChartEventsLoad", "// set up the updating of the chart each second" & vbCr & vbLf & _
" var result = stockData.data;" & vbCr & vbLf & _
" var series = this.series[0];" & vbCr & vbLf & _
" setInterval(function() {" & vbCr & vbLf & _
" var p = String(result[counter]);" & vbCr & vbLf & _
" var splitp = p.split("","");" & vbCr & vbLf & _
" var x = splitp[0];" & vbCr & vbLf & _
" var y = splitp[1];" & vbCr & vbLf & _
" series.addPoint([x, y], true, false, true);" & vbCr & vbLf & _
" counter++;" & vbCr & vbLf & _
"}, 1000);")
ltrChart4.Text = chart4.ToHtmlString()
如果我查看Firebug中的x和y值,我可以看到这些是预期值。但是,我的图表只是从 ~1900 小时开始在 x 轴上更新时间,并每秒添加一个点(根据 javascript 函数),但没有 y 值。此外,y 轴似乎从 -2.5 开始 - 我使用的值都不小于 1000,更不用说 0。我离得很近...
终于开始工作了。这是我的解决方案 - 可能不是最漂亮的,但它有效。重要的一点是传递iterated
iterateData.ToString()
。从这一点开始,您可以循环访问它,然后在每个元素上拆分。我添加了一个检查,以确保一旦我们到达数据集中的最后一个点,点的添加就会停止。仍然要做的是允许它处理多个系列并"播放"它们。
Dim stfipsList4 = (From r In dt4.AsEnumerable() Select r("areaname")).Distinct().ToList()
Dim SeriesList4 As New List(Of Series)(stfipsList4.Count)
Dim seriesItem4(stfipsList4.Count) As Series
Dim xDate4 As DateTime
Dim fakeDate4 As String
Dim sX4 As Integer
sX4 = 1
For Each state In stfipsList4
Dim data As New Dictionary(Of DateTime, Decimal)
Dim stateVal As String = state.ToString
Dim recCount As Integer = dt4.Rows.Count - 1
Dim seriesPointCount As Integer = dt4.Compute("Count(population)", "areaname = '" + stateVal + "'")
Dim chartData As Object(,) = New Object(seriesPointCount - 1, 1) {}
Dim x As Integer = 0
For i As Integer = 0 To recCount
If dt4.Rows(i)("areaname").ToString = stateVal Then
fakeDate4 = "1/1/" + dt4.Rows(i)("periodyear").ToString
xDate3 = DateTime.Parse(fakeDate4)
chartData.SetValue(xDate4.Date, x, 0)
chartData.SetValue(dt4.Rows(i)("population"), x, 1)
x += 1
End If
Next
seriesItem4(sX4) = New Series With {
.Name = state.ToString, _
.Data = New Helpers.Data(chartData)
}
SeriesList4.Add(seriesItem3(sX4))
sX4 = sX4 + 1
Next
Dim iterateData As String = JsonSerializer.Serialize(seriesItem3(1))
Dim chart4 As Highcharts = New Highcharts("chart4").SetOptions(New Helpers.GlobalOptions() With { _
.[Global] = New [Global]() With { _
.UseUTC = False _
} _
}).InitChart(New Chart() With { _
.DefaultSeriesType = ChartTypes.Column, _
.MarginRight = 10, _
.Events = New ChartEvents() With { _
.Load = "ChartEventsLoad" _
} _
}).SetTitle(New Title() With { _
.Text = "Live data" _
}).SetXAxis(New XAxis() With { _
.Type = AxisTypes.Datetime, _
.TickPixelInterval = 150 _
}).SetSeries(New Series() With { _
.Data = New Helpers.Data(New Object() {}), _
.Name = seriesItem3(1).Name
}) _
.AddJavascripVariable("iterated", iterateData.ToString) _
.AddJavascripFunction("ChartEventsLoad", "// set up the updating of the chart each second" & vbCr & vbLf & _
" var result = iterated.data;" & vbCr & vbLf & _
" var counter = 0;" & vbCr & vbLf & _
" var series = this.series[0];" & vbCr & vbLf & _
" var loopseries = function() {" & vbCr & vbLf & _
" if (counter <= result.length) {" & vbCr & vbLf & _
" var p = String(result[counter]);" & vbCr & vbLf & _
" var splitp = p.split("","");" & vbCr & vbLf & _
" var x = Number(splitp[0]);" & vbCr & vbLf & _
" var y = Number(splitp[1]);" & vbCr & vbLf & _
" series.addPoint([x, y], true, series.points.length > 10, true);" & vbCr & vbLf & _
" counter++;" & vbCr & vbLf & _
" } else {" & vbCr & vbLf & _
" clearInterval(loopseries);" & vbCr & vbLf & _
" }};" & vbCr & vbLf & _
" setInterval(loopseries, 100);")
ltrChart4.Text = chart4.ToHtmlString()
您可以在 DotNet.Highchart 项目的示例项目中查看"每秒样条更新"的演示
无论如何,这里有一个示例代码,您可以在迭代数据时每秒在图表中添加点:
Highcharts chart = new Highcharts("chart")
.SetOptions(new GlobalOptions { Global = new Global { UseUTC = false } })
.InitChart(new Chart
{
DefaultSeriesType = ChartTypes.Spline,
MarginRight = 10,
Events = new ChartEvents
{
Load = "ChartEventsLoad"
}
})
.SetTitle(new Title { Text = "Live data" })
.SetXAxis(new XAxis
{
Type = AxisTypes.Datetime,
TickPixelInterval = 150
})
.SetSeries(new Series
{
Name = "Live data",
Data = new Data(new[] { new Point { X = Tools.GetTotalMilliseconds(DateTime.Now), Y = 0 } })
})
.AddJavascripVariable("counter", "0")
.AddJavascripVariable("stockData", JsonSerializer.Serialize(ChartsData.StockData))
.AddJavascripFunction("ChartEventsLoad",
@"// set up the updating of the chart each second
var series = this.series[0];
setInterval(function() {
var x = (new Date()).getTime(); // current time
var y = stockData[counter];
series.addPoint([x, y], true, series.points.length > 10);
counter++;
}, 1000);");
对不起,C# 代码。我希望这是有帮助的,你可以找到好的转换器。
- 如何强制更新Webix数据表中的单选按钮
- 当uib分页被包装在另一个指令中时,AngularJS表数据没有更新
- 数据库更新后刷新数据表
- 使用 ajax 调用使用操作类返回的数据刷新(更新)表的各个行
- 数据表 - 使用 fnUpdate 更新行将替换不同的行
- PrimeFaces 命令按钮使用 jQuery 更新数据表内部
- JQuery 数据表列数据更新工作太慢
- 数据表 - 我应该在哪里更新数据
- KNockoutJS 与 jQuery 数据表,绑定行未正确更新
- 编辑更新的数据源后,从 YUI 数据表中检索更新的数据源
- jQuery Yii 更新数据表,仅当显示 tab 时
- 使用 ajax 请求更新数据表
- 使用数据表行信息更新文本输入,并从对话框中编辑行
- 如何使用 JavaScript 动态更新地图引擎数据表
- 使用从 ajax servlet 调用返回的 json 更新数据表时出错
- 按设置的时间间隔从现有数据表更新数据点
- Jquery 数据表更新单元格文本值和颜色
- 如何防止数据表更新列标题文本
- 更新其中一个数据表单元格的多个下拉值的最佳方法是什么
- 更新Highchart数据表单导出按钮