2016-07-04 11 views
1

我需要创建“心率与时间”图。在xAxis中,我显示的格式是“HH:mm:ss”,y轴是它的十进制值。我的代码如下:为图如何将时间作为xAxis数据值在使用核心图的numberForPlot方法中传递?

数据来源:

 var graphData:[(String,Double)] = [] 
let data = ("17:56:35",Double(65)) 
      let data1 = ("18:04:13",Double(95)) 
      let data2 = ("18:8:35",Double(25)) 
      self.graphData.append(data) 
      self.graphData.append(data1) 
      self.graphData.append(data2) 

设定图和绘图数据代码:

func setGraph() { 
    let tts = CPTMutableTextStyle() 
    tts.fontSize = 75.0 
    tts.color = CPTColor(CGColor: UIColor.blackColor().CGColor) 
    tts.fontName = "HelveticaNeue-Bold" 
    self.graph.titleTextStyle = tts 

    self.graph.title = "Heart Rate vs Time" 

    self.graph.applyTheme(CPTTheme(named:kCPTPlainWhiteTheme)) 
    let plotSpace = graph.defaultPlotSpace as! CPTXYPlotSpace! 

    plotSpace.allowsUserInteraction = false 

    let xRange = plotSpace.xRange.mutableCopy() as! CPTMutablePlotRange 
    xRange.locationDouble = Double(0) 
    xRange.lengthDouble = Double(1000) 
    plotSpace.xRange = xRange 

    let yRange = plotSpace.yRange.mutableCopy() as! CPTMutablePlotRange 
    yRange.locationDouble = Double(0) 
    yRange.lengthDouble = Double(210) 
    plotSpace.yRange = yRange 

    graph.addPlotSpace(plotSpace) 

    graph.plotAreaFrame!.paddingTop = 0 
    graph.plotAreaFrame!.paddingRight = 0 
    graph.plotAreaFrame!.paddingBottom = graphOffset 
    graph.plotAreaFrame!.paddingLeft = graphOffset 
    graph.plotAreaFrame!.masksToBorder = false 

    // Grid line styles 
    let majorLineStyle   = CPTMutableLineStyle() 
    majorLineStyle.lineWidth = 0.75 
    majorLineStyle.lineColor = CPTColor.redColor() 

    let minorLineStyle   = CPTMutableLineStyle() 
    minorLineStyle.lineWidth = 0.25 
    minorLineStyle.lineColor = CPTColor.blackColor() 

    //Axis Line colors 
    let axisLineStyle   = CPTMutableLineStyle() 
    axisLineStyle.lineWidth  = 2.0 
    axisLineStyle.lineColor  = CPTColor.blackColor() 

    //Axis Label colors 
    let labelTextStyle    = CPTMutableTextStyle() 
    labelTextStyle.textAlignment = CPTTextAlignment.Left 
    labelTextStyle.color   = CPTColor.blackColor() 

    //Axis title color 
    let titleTextStyle    = CPTMutableTextStyle() 
    titleTextStyle.textAlignment = CPTTextAlignment.Left 
    titleTextStyle.color   = CPTColor.blackColor() 
    titleTextStyle.fontSize   = 15 

    let dataSourceLinePlot = CPTScatterPlot() 
    let lineStyle    = CPTMutableLineStyle() 
    lineStyle.lineWidth   = 3.0 
    lineStyle.lineColor   = CPTColor.blueColor() 
    dataSourceLinePlot.dataLineStyle = lineStyle 
    dataSourceLinePlot.identifier = kPlotIdentifier 
    //  dataSourceLinePlot.dataSource = self 


    let xts = CPTMutableTextStyle() 
    xts.color = CPTColor(componentRed: 255.0, green: 255.0, blue: 255.0, alpha: 1.0) 


    let dateFormatter = NSDateFormatter() 
    dateFormatter.dateFormat = "HH:mm:ss" 
    let timeformatter = CPTTimeFormatter(dateFormatter: dateFormatter) 
    timeformatter.referenceDate = NSDate() 

    let axisSet = graph.axisSet as! CPTXYAxisSet! 

    let xAxis = axisSet.xAxis as CPTXYAxis! 
    xAxis.axisTitle = CPTAxisTitle(text: "Elapsed Time", textStyle: xts) 
    xAxis.labelFormatter = timeformatter 
    xAxis.majorGridLineStyle = majorLineStyle 
    xAxis.minorGridLineStyle = minorLineStyle 
    xAxis.majorIntervalLength = NSNumber(double: 60.0) 

    let yAxis = axisSet.yAxis as CPTXYAxis! 
    yAxis.axisTitle = CPTAxisTitle(text: "Heart Rate", textStyle: xts) 
    let axisFormatter = NSNumberFormatter() 
    axisFormatter.maximumFractionDigits = 0 
    axisFormatter.minimumIntegerDigits = 1 
    yAxis.labelFormatter = axisFormatter 
    yAxis.titleOffset = 35.0 
    yAxis.majorIntervalLength = 20 
    yAxis.majorGridLineStyle = majorLineStyle 
    yAxis.minorGridLineStyle = minorLineStyle 


    graph.addPlot(dataSourceLinePlot) 
    self.IBviewGraph.hostedGraph = self.graph 

} 

要绘制数据:

func setGraphData() { 

    dispatch_sync(dispatch_get_main_queue(), { 

    let plot = CPTScatterPlot() 
    plot.dataSource = self 

    let actualPlotStyle = plot.dataLineStyle!.mutableCopy() as! CPTMutableLineStyle 
    actualPlotStyle.lineWidth = 2.0 
    actualPlotStyle.lineColor = CPTColor(CGColor: (UIColor.yellowColor().CGColor)) 
    plot.dataLineStyle = actualPlotStyle 
    plot.interpolation = .Linear 

    self.graph.addPlot(plot) 

    }) 
} 

数据源方法

func numberOfRecordsForPlot(plot: CPTPlot) -> UInt { 
    return 3 
} 

func numberForPlot(plot: CPTPlot, field: UInt, recordIndex: UInt) -> AnyObject?{ 

    var num = NSNumber() 
    let index = Int(recordIndex) 
    switch field { 
    case 0://xaxis 

     return graphData[index].0 

    case 1://yaxis 
     return graphData[index].1 
    default: 
     break 
    } 
    print("coordintes = ",num) 
    return num 
} 

我的图被淹没了,但只有yAxis点是正确的,它没有考虑xAxis值,所以因为这些点在图中位置错误。我认为我在xAxis的numberForPlot方法中传递的值是错误的,但不知道如何传递它。给我一些解决方案。

image

+0

'CPTColor'与'UIColor'和'NSColor'具有相同的预定义颜色。例如''tts.color = CPTColor(CGColor:UIColor.blackColor()。CGColor)'也可以在Swift 3中写成'tts.color = .blackColor()'(或'.black()')。 –

回答

1

graphData阵列中的x值是字符串。 Core Plot期望数据源为每个索引返回一个数值。它从时间字符串读取小时数,并将其用于x值。

x轴配置为显示范围为0到1,000的数字。因此,您需要将时间数据转换为该范围内的数字。跟踪用于格式化轴标签的参考日期(即将其存储在实例变量中),并使用该日期将时间数据转换为距参考日期(以秒为单位)的偏移量。

+0

numberForPlot如何期待数值?它有返回类型的Anyobject,所以我的字符串不会工作?如果是的话,你可以解释更多的例子或与代码,我怎么能匹配我的字符串时间“17:56:35”有关的X轴点? –

+0

如果我把我的字符串“17:56:35”转换成秒,然后绘制它仍然是错误的值,那么如何匹配x轴与时间? –

+0

我无法从时间字符串中找到正确的号码。我正在使用日期格式,并在几秒钟内获得时间,但该值在图表上也未显示正确 –

相关问题