Charts: Mise à jour animée

Créé le 7 juil. 2015  ·  21Commentaires  ·  Source: danielgindi/Charts

Salut!
Existe-t-il un moyen de mettre à jour les données LineChartView (ChartData) et de redessiner LineChartView animé à partir de la position actuelle.
Comme dans l'application appFigures.
Merci.

idea

Commentaire le plus utile

Cela fait plus de deux ans, est-ce que quelqu'un sait comment mettre cela en œuvre?

Tous les 21 commentaires

C'est en fait une fonctionnalité à laquelle j'ai déjà pensé et que je prévois de mettre en œuvre.
Nous avons beaucoup de choses dans notre assiette en ce moment - alors en attendant si cela est vraiment important pour vous - vous pouvez faire ceci :

Créez une fonction qui prend l'ensemble de données _A_, l'ensemble de données _B_ et une valeur _phase_ comprise entre 0 et 1 .
Cette fonction va :

  1. Définir un nouveau jeu de données _C_
  2. Itérer sur chaque valeur dans _A_ et définir C[i] = (B[i] - A[i]) * phase + A[i]
  3. Renvoie _C_ comme nouvel ensemble de données

Vous devez maintenant animer un nombre simple de 0 à 1 , et le transmettre à la fonction avec les ensembles de données « de » et « à ». Le résultat doit être passé à la vue graphique :-)

Vous pouvez également utiliser l'utilitaire d'animation dans les graphiques, qui peut déjà animer un nombre pour vous, y compris l'accélération et d'autres éléments.

C'est donc à peu près un gâteau à la pêche, et dès que je pourrai, je prévois de l'ajouter à la bibliothèque. Mais au moins tu as une solution pour le moment ;-)

Salut! Est-ce une fonctionnalité déjà implémentée ?

J'ai besoin d'animer en ajoutant une nouvelle valeur à l'ensemble de données et en changeant la position de la ligne de limite.

Bonjour, j'essaie d'appliquer l'animation du changement de données dans un graphique à secteurs. J'ai déjà la fonction que vous avez mentionnée mais j'ai du mal à trouver un moyen "d'animer un nombre simple de 0 à 1". Des idées à ce sujet ? Merci!

Salut! La fonctionnalité est déjà implémentée ?

Ajout de ma prise en charge de cette fonctionnalité et recherche d'un bon moyen d'interpoler une valeur simple en fonction d'une fonction d'assouplissement (pour la solution de contournement). Toutes les bibliothèques d'animation semblent fonctionner sur des vues ou des propriétés, mais je veux juste "animer" la valeur d'un simple nombre. J'ai l'impression que ça devrait être simple, peut-être que je cherche au mauvais endroit ?

Vous voudrez peut-être jeter un œil à l'article ci-dessous où j'ai partagé ma solution. Je suis conscient que c'est loin d'être parfait mais ça a l'air de fonctionner, ce qui est bien. http://stackoverflow.com/questions/34730917/animating-a-double-from-0-to-1-in-swift-over-a-specified-interval/34774113#34774113

Merci pour la réponse rapide @apiejh , je l'apprécie vraiment. J'ai réussi à faire fonctionner cela avec une fonction de minuterie. Hacky, mais fonctionne! Au moins jusqu'à ce qu'une meilleure approche soit disponible.

Des mises à jour ou des solutions possibles pour cela ?

+1, j'ai un graphique avec des données et lorsqu'un processus asynchrone se termine, je souhaite ajouter un ou plusieurs nouveaux ensembles de données et/ou étendre les points de données d'un ensemble de données (par exemple _live data_). Ce serait beaucoup plus agréable si le graphique pouvait animer ces nouveaux ensembles de données au lieu de reconstruire à partir de zéro.

"Vous pouvez également utiliser l'utilitaire d'animation dans Charts, qui peut déjà animer un nombre pour vous, y compris l'assouplissement et tout ça."

Je ne vois aucune option pour animer un seul ensemble de données uniquement l'ensemble du graphique. Est-ce que j'ai raté quelque chose ?

Cela fait plus de deux ans, est-ce que quelqu'un sait comment mettre cela en œuvre?

Cela va-t-il jamais être mis en œuvre? J'aimerais pouvoir faire quelque chose d'aussi simple que

lineChart.animate(to: newDataSet, duration: 1.0);

Effacez simplement le tableau des anciennes valeurs et remplissez-le avec les nouvelles avant d'appeler à nouveau le setupChart()

Nous sommes déjà en 2019 et existe-t-il une solution pour animer les modifications de données sans redessiner l'ensemble du graphique à partir de zéro ? ??

Cela fait plus de deux ans, est-ce que quelqu'un sait comment mettre cela en œuvre?

Cela fait plus de quatre ans maintenant, quelque chose me dit qu'on n'y arrivera jamais :(

Je ne sais pas pourquoi le PR # 2889 est fermé, mais pour ceux qui veulent encore des extraits de code rapides pour la mise en œuvre de danielgindis : https://github.com/mrjko/testCharts/blob/master/chartsTest/BarChartViewController/BarChartViewController.swift

Est-ce que quelqu'un connaît un moyen de le faire pour lineChart, je dois changer la position du point en douceur sans redessiner l'ensemble du graphique.

@vittorionapoli Vous pouvez utiliser le même que @mrjko posté ci-dessus, mais remplacez-le par LineChartDataSet

func partialResults(setA: LineChartDataSet, setB: LineChartDataSet, phase: Double) -> LineChartDataSet {
    let newSet = LineChartDataSet()

    for index in 0..<setA.entries.count {
        let currA = setA.entries[index].y
        let currB = setB.entries[index].y

        let newValue = (currB - currA) * phase + currA
        newSet.append(BarChartDataEntry(x: Double(index), y: newValue))
    }

    return newSet
}

@mrjko Comment la méthode ci-dessus fonctionnera-t-elle pour un tableau de valeurs y pour un graphique à barres empilées ?
BarChartDataEntry(x: Double(index), yValues: [anArrayOfyValues])

Mettre à jour la solution présentée avec LineChartDataSet et également ajouter/supprimer de nouvelles valeurs du dataSet si la taille des setA et setB est différente.

    func partialResults(setA: LineChartDataSet, setB: LineChartDataSet, phase: Double) -> LineChartDataSet {
        let newSet = LineChartDataSet()
        let setACount = setA.entries.count
        let setBCount = setB.entries.count

        for index in 0..<min(setACount, setBCount) {
            let currA = setA.entries[index].y
            let currB = setB.entries[index].y

            let newValue = (currB - currA) * phase + currA
            newSet.append(ChartDataEntry(x: Double(index), y: newValue))
        }

        let diff = abs(setACount - setBCount)
        if setACount < setBCount {
            for index in setBCount - diff..<setBCount {
                let currB = setB.entries[index].y
                let newValue = currB
                newSet.append(ChartDataEntry(x: Double(index), y: newValue))
            }
        } else if setACount > setBCount {
            for index in setACount - diff..<setACount {
                let currA = setA.entries[index].y
                let newValue = currA
                newSet.append(ChartDataEntry(x: Double(index), y: newValue))
            }
        }

        return newSet
    }

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