2017-05-09 3 views
1

J'ai trouvé une question similaire sur ici, mais la réponse ne m'a pas aidé. Je pense en raison de ma structure de données.iOS Charts 3 - Aligner X étiquettes (dates) avec des parcelles

J'ai un tableau composé de tableaux individuels, chacun pour sa propre ligne dans le tableau. ceci est alors composé de plusieurs structs pour les points d'intrigue de cette ligne.

Mon problème est que les valeurs/lignes sont correctes, mais ne s'alignent pas correctement avec les dates. Dans l'exemple ci-dessous. les dates commencent le 3 mai et finissent le 8 mai. S'il vous plaît aider

ici est mon 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

Répondre

0

J'utilise les dates de l'axe x et dans l'un de mes projets et j'ai simplement changé chaque date une chaîne et transmis un tableau de valeurs de chaîne à un IndexAxisValueFormatter.

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

Si ce n'est pas ce que vous cherchez, pouvez-vous montrer un échantillon de ce que "ensembles" comprend? Ensuite, je serai en mesure d'exécuter votre code.

+0

est-ce pas la même chose que (= laisser xaxis testLineChartView.xAxis xaxis.valueFormatter = axisFormatDelegate)? – ThundercatChris

+0

J'ai mis à jour mon code pour montrer quel est l'ensemble. il s'agit essentiellement d'un tableau avec des tableaux de points de l'intrigue, constitués de tableaux de structures. De cette façon, une ligne peut avoir plusieurs points de tracé à l'intérieur d'un tableau et une autre ligne peut avoir ses propres points. J'espère que cela a du sens – ThundercatChris

+0

J'ai également essayé d'utiliser un tableau de chaînes de date (je pense que c'est ce que vous avez suggéré), mais encore une fois, ils sont mal alignés. Je ne pense pas que les cordes sont le problème. c'est le décalage – ThundercatChris