CorePlot实时绘图
CorePlot real-time plotting
我是 swift 开发的新手。我最近使用 CorePlot 来帮助我实时绘制来自传感器的 ECG 数据。传感器的采样率为250points/sec。起初,我每 5 个点读取一次绘制一次,然后刷新视图,直到散点布满视图(大约 1000 个点)。但是我发现效率很低,数据会丢失。
后来我看到我可以使用-insertDataAtIndex:numberOfRecords
插入更新点来改变图表。我在 CorePlot 中引用了 RealTimePlot 示例,但我不知道在 Swift 中具体怎么做。你能给我 Swift 中的 RealTimePlot 示例或告诉我怎么做吗?
请帮帮我。
typealias plotDataType = [CPTScatterPlotField : Double]
private var scatterGraph : CPTXYGraph? = nil
func plotChart(ecg:[Int]){
let ecgLinePlot = CPTScatterPlot(frame: CGRectZero)
var ecgContentArray = [plotDataType]()
for i in 0 ..< ecg.count { //ecg.count=1000
let y = Double(ecg[i])/65535.0 + 0.05
let x = Double(i) * 0.1
let dataPoint: plotDataType = [.X: x, .Y:y]
ecgContentArray.append(dataPoint)
}
ecgDataForPlot = ecgContentArray
// MARK: - Plot Data Source Methods
func numberOfRecordsForPlot(plot: CPTPlot) -> UInt
{
return UInt(self.ecgDataForPlot.count)
}
func numberForPlot(plot: CPTPlot, field: UInt, recordIndex: UInt) -> AnyObject?
{
let plotField = CPTScatterPlotField(rawValue: Int(field))
if let ecgNum = self.respDataForPlot[Int(recordIndex)][plotField!]{
return ecgNum as NSNumber
}
}
您遵循 "Real Time Plot" 演示使用的相同过程。更新操作发生在 -newData:
方法中。该演示使用计时器定期调用此方法,但您可以从任何地方提供新数据,例如来自传感器设备的回调或委托。
这些是要遵循的基本步骤:
如果添加新点会使总数据集大于您要显示的数据,请从数据集开头删除旧点。从绘图和本地数据缓存 (ecgDataForPlot
) 中删除它们。如果您希望用户能够滚动回到历史记录,您可以保留它们。该演示不需要保留旧数据,因为它会自动滚动并且无法返回并查看过去的数据。
更新绘图范围以包括新数据点。该演示动画更改,但这部分是可选的。
将新数据点添加到本地数据缓存(ecgDataForPlot
)。
调用-insertDataAtIndex:numberOfRecords:
告诉绘图加载新数据。该演示总是在现有数据集的末尾添加新数据,这对时间序列有意义,但您可以在任何地方插入新数据。
我是 swift 开发的新手。我最近使用 CorePlot 来帮助我实时绘制来自传感器的 ECG 数据。传感器的采样率为250points/sec。起初,我每 5 个点读取一次绘制一次,然后刷新视图,直到散点布满视图(大约 1000 个点)。但是我发现效率很低,数据会丢失。
后来我看到我可以使用-insertDataAtIndex:numberOfRecords
插入更新点来改变图表。我在 CorePlot 中引用了 RealTimePlot 示例,但我不知道在 Swift 中具体怎么做。你能给我 Swift 中的 RealTimePlot 示例或告诉我怎么做吗?
请帮帮我。
typealias plotDataType = [CPTScatterPlotField : Double]
private var scatterGraph : CPTXYGraph? = nil
func plotChart(ecg:[Int]){
let ecgLinePlot = CPTScatterPlot(frame: CGRectZero)
var ecgContentArray = [plotDataType]()
for i in 0 ..< ecg.count { //ecg.count=1000
let y = Double(ecg[i])/65535.0 + 0.05
let x = Double(i) * 0.1
let dataPoint: plotDataType = [.X: x, .Y:y]
ecgContentArray.append(dataPoint)
}
ecgDataForPlot = ecgContentArray
// MARK: - Plot Data Source Methods
func numberOfRecordsForPlot(plot: CPTPlot) -> UInt
{
return UInt(self.ecgDataForPlot.count)
}
func numberForPlot(plot: CPTPlot, field: UInt, recordIndex: UInt) -> AnyObject?
{
let plotField = CPTScatterPlotField(rawValue: Int(field))
if let ecgNum = self.respDataForPlot[Int(recordIndex)][plotField!]{
return ecgNum as NSNumber
}
}
您遵循 "Real Time Plot" 演示使用的相同过程。更新操作发生在 -newData:
方法中。该演示使用计时器定期调用此方法,但您可以从任何地方提供新数据,例如来自传感器设备的回调或委托。
这些是要遵循的基本步骤:
如果添加新点会使总数据集大于您要显示的数据,请从数据集开头删除旧点。从绘图和本地数据缓存 (
ecgDataForPlot
) 中删除它们。如果您希望用户能够滚动回到历史记录,您可以保留它们。该演示不需要保留旧数据,因为它会自动滚动并且无法返回并查看过去的数据。更新绘图范围以包括新数据点。该演示动画更改,但这部分是可选的。
将新数据点添加到本地数据缓存(
ecgDataForPlot
)。调用
-insertDataAtIndex:numberOfRecords:
告诉绘图加载新数据。该演示总是在现有数据集的末尾添加新数据,这对时间序列有意义,但您可以在任何地方插入新数据。