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: 方法中。该演示使用计时器定期调用此方法,但您可以从任何地方提供新数据,例如来自传感器设备的回调或委托。

这些是要遵循的基本步骤:

  1. 如果添加新点会使总数据集大于您要显示的数据,请从数据集开头删除旧点。从绘图和本地数据缓存 (ecgDataForPlot) 中删除它们。如果您希望用户能够滚动回到历史记录,您可以保留它们。该演示不需要保留旧数据,因为它会自动滚动并且无法返回并查看过去的数据。

  2. 更新绘图范围以包括新数据点。该演示动画更改,但这部分是可选的。

  3. 将新数据点添加到本地数据缓存(ecgDataForPlot)。

  4. 调用-insertDataAtIndex:numberOfRecords:告诉绘图加载新数据。该演示总是在现有数据集的末尾添加新数据,这对时间序列有意义,但您可以在任何地方插入新数据。