CorePlot实时绘图

问题描述 投票:1回答:1

我是快速发展的新手。我最近使用CorePlot帮助我实时从传感器中提取ECG数据。传感器的采样率为250点/秒。首先,我读取每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
    }
}
swift plot real-time core-plot
1个回答
0
投票

您按照“实时绘图”演示使用的相同过程进行操作。更新操作发生在-newData:方法中。该演示使用计时器定期调用此方法,但您可以从任何地方提供新数据,例如来自传感器设备的回调或委托。

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

  1. 如果添加新数据集将使总数据集大于您要显示的数据集,则从数据集的开头删除旧点。从绘图和本地数据缓存(ecgDataForPlot)中删除它们。如果您希望用户能够滚动回历史记录,您可以保留它们。该演示不需要保留旧数据,因为它会自动滚动,并且无法返回并查看过去的数据。
  2. 更新绘图范围以包括新数据点。该演示动画更改,但此部分是可选的。
  3. 将新数据点添加到本地数据缓存(ecgDataForPlot)。
  4. 调用-insertDataAtIndex:numberOfRecords:告诉图表加载新数据。该演示总是在现有数据集的末尾添加新数据,这对于时间序列是有意义的,但您可以在任何地方插入新数据。
© www.soinside.com 2019 - 2024. All rights reserved.