2016-07-04 3 views
1

「心拍数と時間」のグラフを作成する必要があります。 xAxisでは "HH:mm:ss"の形式でy軸に10進数の値を表示しています。私のコードは以下の通りである:グラフのコアプロットを使用してnumberForPlotメソッドのxAxisデータ値として時間を渡す方法は?

データソース:

グラフとプロットデータコードを設定し
 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

graphData
+0

'CPTColor'には' UIColor'と 'NSColor'と同じ定義済みの色があります。たとえば、 'tts.color = CPTColor(CGColor:UIColor.blackColor()。CGColor)'はSwift 3で 'tts.color = .blackColor()'(または '.black()')として記述することもできます。 –

答えて

1

アレイにおけるxの値は文字列です。 Core Plotは、データソースが各インデックスの数値を返すことを期待しています。これは、時間の文字列から時間を読み取り、それをx値として使用しています。

x軸は、0〜1,000の範囲の数値を表示するように設定されています。したがって、時間データをその範囲の数値に変換する必要があります。軸ラベルをフォーマットする(つまりインスタンス変数に格納する)ために使用される参照日付を追跡し、それを使用して基準データからの秒単位のオフセットに時間データを変換します。

+0

numberForPlotは数値をどのように想定していますか?それは戻り値の型Anyobjectを持っているので、私の文字列は機能しませんか?そうであれば、x軸の点に関連する文字列の時間「17:56:35」にどのように一致させることができるのかを例またはコードで詳しく説明できますか? –

+0

私の文字列を「17:56:35」に変換して秒に変換し、それでも間違った値をプロットすると、x軸と時刻をどのように一致させるのでしょうか? –

+0

タイムストリングから正しい番号を見つけることができません。私は日付フォーマッタを使用しており、秒単位で時間を取得していますが、その値もグラフに正しく表示されていません。 –

関連する問題