2015-12-22 90 views
1

我对swift开发很陌生。我最近使用CorePlot来帮助我实时绘制来自传感器的ECG数据。传感器的采样率是250点/秒。起初,我读了每5点画一次,然后刷新视图,直到填充视图的散点(大约1000点)。但是我发现效率不高,数据会丢失。CorePlot实时绘图

之后,我看到我可以插入更新点来使用-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 
    } 
} 

回答

0

您遵循“Real Time Plot”演示使用的相同流程。更新操作发生在-newData:方法中。演示程序使用定时器定期调用此方法,但您可以从任何位置提供新数据,例如来自传感器设备的回调或委托。

这些是基本步骤如下:

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

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

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

  4. 拨打-insertDataAtIndex:numberOfRecords:告诉小区加载新数据。演示文稿总是在现有数据集的末尾添加新数据,这对于时间序列是有意义的,但您可以在任何地方插入新数据。

+0

谢谢埃里克,但我仍然坚持下去。 我想更清楚地问你每一步。你的意思是从剧情中删除旧点,缓存意味着“ecgLinePlot”和“ecgDataForPlot”?我应该使用什么函数? 我目前发现ecgLinePlot.deleteDataInIndexRange,ecgLinePlot.insertDataAtindex,ecgDataForPlot.removeAtIndex,respDataForPlot.insert,我应该为每个步骤使用哪个函数? 谢谢。 – lktlktlkt

+0

这听起来像你在正确的轨道上。如果您无法正常工作,请发布您的代码,以便我们帮助解决问题。 –

+0

它的工作!埃里克,非常感谢。 – lktlktlkt