2017-05-09 5 views
1

여기에서 비슷한 질문을 발견했지만 대답이 도움이되지 않았습니다. 내 데이터 구조로 인해 생각합니다.iOS 차트 3 - 플롯으로 X 라벨 (날짜) 정렬

개별 배열로 구성된 배열이 있습니다. 각 배열은 차트의 각 줄에 있습니다. 이것은 그 라인의 플롯 포인트에 대한 여러 구조체로 구성됩니다.

내 문제는 값/줄이 맞지만 날짜와 올바르게 정렬되지 않는다는 것입니다. 아래 예제에서. 날짜는 5 월 3 일과 5 월 8 일에 시작됩니다. 도와주세요 여기

내 코드

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

답변

0

이다 나는 x 축에 날짜뿐만 아니라 내 프로젝트 중 하나를 사용하고 난 단지에 각 날짜 변경 문자열 및 문자열 값 배열을 IndexAxisValueFormatter에 전달합니다.

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

이것이 원하는 것이 아니라면 "세트"에 포함 된 샘플을 보여줄 수 있습니까? 그러면 코드를 실행할 수 있습니다.

+0

되는 것은이 같은 아니라고 생각 (하자 X- 축 = testLineChartView.xAxis xaxis.valueFormatter = axisFormatDelegate)? – ThundercatChris

+0

세트가 무엇인지 보여주기 위해 코드를 업데이트했습니다. 그것은 기본적으로 구조체의 배열로 구성된 플롯 포인트의 배열을 가진 배열입니다. 그런 식으로 한 줄은 배열 안에 여러 줄거리를 가질 수 있고 다른 줄은 그 줄을 가질 수 있습니다. – ThundercatChris

+0

나는 또한 날짜 문자열의 배열을 사용하여 시도했다. (나는 당신이 제안한 것을 생각한다.)하지만 다시 정렬되지 않았다. 나는 문자열이 문제라고 생각하지 않는다. 그것의 오프셋 – ThundercatChris