Charts: [Swift 3] LineChartData sans xVals sur le constructeur

Créé le 7 nov. 2016  ·  12Commentaires  ·  Source: danielgindi/Charts

Je sais que "Tous les constructeurs de jeux de données ont changé - ils ne prennent plus de tableau d'indices x", mais comment puis-je mettre des chaînes sur mon axe x maintenant si LineChartData n'a plus de paramètres "xVals" ???
Avant, c'était si facile de faire ça...

let weights: [Double] = self.getWeigths()
let weightDates: [String] = self.getWeightDates()

var yValues : [ChartDataEntry] = [ChartDataEntry]()
    for i in 0 ..< dateLastWeights.count {
        let entry = ChartDataEntry(x: Double(i), y: weights[i])
        yValues.append(entry)
    }
let set: LineChartDataSet = LineChartDataSet(values: yValues, label: "First Set")
var dataSets : [LineChartDataSet] = [LineChartDataSet]()
dataSets.append(set)

let data: LineChartData = LineChartData(xVals: weightDates, dataSets: dataSets)
self.lineChart.data = data

Commentaire le plus utile

J'avais aussi du mal avec ça, mais j'ai finalement compris. Vous devez en fait le définir sur le BarChartView lui-même à l'aide d'un formateur de valeur d'axe :

let labels = ["Value 1", "Value 2", "Value 3"]
barChartView.xAxis.valueFormatter = DefaultAxisValueFormatter(block: {(index, _) in
    return labels[Int(index)]
})

Ce n'est certainement pas aussi propre que la façon précédente de le faire.


EDIT par danielgindi

Depuis la 3.0.1, vous pouvez également faire :

barChartView.xAxis.valueFormatter = IndexAxisValueFormatter(values: labels)

Aussi, vous voudrez probablement ajouter :

barChartView.xAxis.granularity = 1.0

Tous les 12 commentaires

J'avais aussi du mal avec ça, mais j'ai finalement compris. Vous devez en fait le définir sur le BarChartView lui-même à l'aide d'un formateur de valeur d'axe :

let labels = ["Value 1", "Value 2", "Value 3"]
barChartView.xAxis.valueFormatter = DefaultAxisValueFormatter(block: {(index, _) in
    return labels[Int(index)]
})

Ce n'est certainement pas aussi propre que la façon précédente de le faire.


EDIT par danielgindi

Depuis la 3.0.1, vous pouvez également faire :

barChartView.xAxis.valueFormatter = IndexAxisValueFormatter(values: labels)

Aussi, vous voudrez probablement ajouter :

barChartView.xAxis.granularity = 1.0

@esalter-va Ouais ! ça marche vraiment !! Mais d'une manière ou d'une autre, le graphique affiche plus d'index qu'il ne le devrait... Il montre des nombres décimaux bizarres sur le paramètre "index" comme (3.5; 0; 0.69; 1.39; 2.09; 2.79; 3.5) puis il convertit en Int (3; 1 ; 1; 2; 2; 3) mais mon yValues ​​n'a que 4 éléments... Avez-vous ce genre de problème ?

Jamais ! Ce problème était dû au fait que la granularité ! J'ai essayé la granularité = 1 et ça marche !

@reicamargo Merci d'avoir publié votre solution, car j'avais exactement le même problème. Tout va bien maintenant!

barChart.xAxis.granularity = 1

Salut les gars. Vous pouvez en fait utiliser le nouveau IndexAxisValueFormatter , qui teste les limites, etc., et simule l'ancien comportement de l'index.

Donc chart.xAxis.valueFormatter = IndexAxisValueFormatter(values: ["first index", "second index", "third index"]) , combiné avec granularity = 1 fera très bien l'affaire :-)

Si vous n'avez pas défini la granularité, cela se comportera toujours correctement et n'affichera pas les étiquettes pour les valeurs fractionnées. Cela signifie donc que les étiquettes peuvent être masquées lorsque des valeurs entières ne sont pas rendues ;

Comment se fait-il que lorsque je fais tout le truc xAxis, j'obtiens une erreur fatale : PieChart n'a pas de fichier XAxis : ?

@danielgindi il y a quelqu'un qui dit que IndexAxisValueFormatter a des problèmes lors du zoom https://github.com/danielgindi/Charts/issues/1909.

@danielgindi on devrait faire ça pour chaque set ? ou cela devrait être après avoir créé le dataSet avec tous les ensembles ?.

Merci

Je suis désolé de poster sur un problème clos. Cependant, j'ai le même problème, cette solution ne fonctionne pas pour moi.
mon problème

Je m'excuse d'avoir également publié un article sur un problème clos, mais j'ai lu cela au cours des 7 dernières heures et je suis perdu. Supposons que vous souhaitiez avoir une étiquette sur l'axe des X pour chaque jour de la semaine. Si vous utilisez la solution publiée par esalter-va, les étiquettes semblent dépendre des données de sauvegarde. C'est-à-dire que si vous n'avez que des données pour lundi, l'index référencé par le formateur de valeur ne sera jamais égal à la représentation Int pour lundi, et aucun autre jour. Ainsi, vous n'obtiendrez qu'un seul label (lundi). Si vous voulez une étiquette pour chaque jour, peu importe si vous avez des données pour ce jour, comment le faites-vous ?

@bsachetta. Tu n'es pas seul. Je suis aux prises avec ce problème depuis des semaines. Pour autant que je sache, il n'y a pas de support pour un point de données nul. Vous devez avoir une valeur pour chaque axe x séquentiel ou vous devrez trouver vous-même comment les ignorer. J'ai pu comprendre comment faire cela et cela fonctionne en quelque sorte, mais cela s'effondre lorsque vous n'avez pas suffisamment de points de données pour remplir la fenêtre.

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

kwstasna picture kwstasna  ·  3Commentaires

anhltse03448 picture anhltse03448  ·  3Commentaires

BrandonShega picture BrandonShega  ·  4Commentaires

guoyutaog picture guoyutaog  ·  3Commentaires

sjdevlin picture sjdevlin  ·  3Commentaires