2 votes

iOS Charts 3 - Aligner les étiquettes X (dates) avec les tracés

J'ai trouvé une question similaire ici, mais la réponse ne m'a pas aidé. Je pense que c'est dû à ma structure de données.

J'ai un tableau composé de tableaux individuels, chacun pour sa propre ligne dans le graphique. Il est ensuite composé de plusieurs structs pour les points de tracé 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 se terminent le 8 mai. Merci de m'aider.

voici 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

0voto

DevB2F Points 1537

J'utilise également des dates sur l'axe des x dans l'un de mes projets et j'ai simplement transformé chaque date en une chaîne de caractères 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 recherchez, pouvez-vous montrer un exemple de ce que "sets" comprend ? Je serai alors en mesure d'exécuter votre code.

0voto

ThundercatChris Points 266

Voici un autre fil de discussion que j'ai commencé avec un problème concernant une valeur unique qui ne s'affiche pas. Il inclut le code qui a également résolu ce problème.

Je pense que le point principal étant

 xaxis.forceLabelsEnabled = true

Graphiques iOS - les valeurs individuelles ne s'affichent pas Swift

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X