2017-05-09 5 views
1

Ich habe eine ähnliche Frage hier gefunden, aber die Antwort hat mir nicht geholfen. Ich denke aufgrund meiner Datenstruktur.iOS Charts 3 - X-Labels (Daten) mit Plots ausrichten

Ich habe ein Array aus einzelnen Arrays, jede für eine eigene Zeile im Diagramm. Dies besteht dann aus mehreren Strukturen für die Plotpunkte dieser Linie.

Mein Problem ist, dass Werte/Zeilen korrekt sind, aber nicht korrekt mit den Daten ausgerichtet sind. Im folgenden Beispiel. Die Termine beginnen am 3. Mai und enden am 8. Mai. Bitte helfen

hier ist mein Code

struct chartPoint { 
let date:String 
var total:Double 
let exercise:String 
} 
var sets:[[chartPoint]] = [] 

func setupLineChart() { 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateFormat = "yyyy-MM-dd" 
    var dataSets:[LineChartDataSet] = [] 
    var color:[UIColor] = [UIColor.red,UIColor.blue, UIColor.green,UIColor.red,UIColor.red,UIColor.red,UIColor.red] 
    for i in sets { //Array of array of structs 
     let sort = i.sorted { // sort the internal array by date 
      item1, item2 in 
      let date1 = dateFormatter.date(from:item1.date) 
      let date2 = dateFormatter.date(from:item2.date) 
      return date1!.compare(date2!) == ComparisonResult.orderedAscending 
     } 
     var dataEntries: [ChartDataEntry] = [] 
     for stat in 0...(sort.count - 1) { 
      let date = dateFormatter.date(from:sort[stat].date) 
      let timeIntervalForDate: TimeInterval = date!.timeIntervalSince1970 
      let dataEntry = ChartDataEntry(x: Double(timeIntervalForDate), y: sort[stat].total) 
      dataEntries.append(dataEntry) 
      if stat == (sort.count - 1){ 
       let chartDataSet = LineChartDataSet(values: dataEntries, label: "\(sort[stat].exercise)") 
       chartDataSet.setCircleColor(color[stat]) 
       chartDataSet.setColor(color[stat], alpha: 1.0) 

       chartDataSet.drawValuesEnabled = true 
       dataSets.append(chartDataSet) 
       startChart(dataSets: dataSets) 
      } 
     } 
    } 

} 

func startChart(dataSets:[LineChartDataSet]){ 
    testLineChartView.animate(xAxisDuration: 0.7, yAxisDuration: 0.7) 
    testLineChartView.dragEnabled = true 
    testLineChartView.legend.form = .circle 
    testLineChartView.drawGridBackgroundEnabled = false 

    let xaxis = testLineChartView.xAxis 
    xaxis.valueFormatter = axisFormatDelegate 
    xaxis.labelCount = dataSets.count 
    xaxis.granularityEnabled = true 
    xaxis.granularity = 1.0 
    xaxis.centerAxisLabelsEnabled = true 
    xaxis.avoidFirstLastClippingEnabled = true 
    xaxis.drawLimitLinesBehindDataEnabled = true 

    let rightAxis = testLineChartView.rightAxis 
    rightAxis.enabled = false 

    let leftAxis = testLineChartView.leftAxis 
    leftAxis.drawZeroLineEnabled = true 
    leftAxis.drawGridLinesEnabled = true 
    axisFormatDelegate = self 
    testLineChartView.delegate = self 

    let chartData = LineChartData(dataSets: dataSets) 
    testLineChartView.data = chartData 
    testLineChartView.chartDescription?.text = "" 
} 

extension ChartViewController: IAxisValueFormatter { 
func stringForValue(_ value: Double, axis: AxisBase?) -> String { 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateFormat = "dd MMM" 
    let date = Date(timeIntervalSince1970: value) 
    return dateFormatter.string(from: date) 
} 

}

enter image description here

Antwort

0

Ich verwende Daten auf der x-Achse als auch in einem meiner Projekte und ich einfach jeden Tag gewechselt eine Zeichenfolge und übergab ein Array von Zeichenfolgenwerten an einen IndexAxisValueFormatter.

testLineChartView.xAxis.valueFormatter = IndexAxisValueFormatter(values: xvalues) 

Wenn dies nicht das ist, was Sie suchen, können Sie ein Beispiel zeigen, was "Sets" beinhaltet? Dann kann ich deinen Code ausführen.

+0

Ist das nicht das gleiche wie (lassen xaxis = testLineChartView.xAxis xaxis.valueFormatter = axisFormatDelegate) zu sein? – ThundercatChris

+0

Ich habe meinen Code aktualisiert, um zu zeigen, welcher Satz ist. Es ist im Grunde ein Array mit Arrays von Plot-Punkten, die aus Arrays von Strukturen bestehen. Auf diese Weise kann eine Zeile mehrere Zeichenpunkte innerhalb eines Arrays haben und eine andere Zeile kann ihre eigenen haben. Ich hoffe, dass das Sinn macht – ThundercatChris

+0

Ich habe auch versucht, mit einem Array von Datumszeichenfolgen (ich denke, das ist, was Sie vorgeschlagen haben), aber wieder sind sie falsch ausgerichtet. Ich denke nicht, dass die Saiten das Problem sind. es ist der Offset – ThundercatChris