Charts: Animiertes Update

Erstellt am 7. Juli 2015  ·  21Kommentare  ·  Quelle: danielgindi/Charts

Hi!
Gibt es eine Möglichkeit, LineChartView-Daten (ChartData) zu aktualisieren und LineChartView von der aktuellen Position animiert neu zu zeichnen.
Wie in der appFigures-Anwendung.
Vielen Dank.

idea

Hilfreichster Kommentar

Es ist über zwei Jahre her, weiß jemand wie man das umsetzt?

Alle 21 Kommentare

Dies ist eigentlich eine Funktion, über die ich bereits nachgedacht habe und die ich planen möchte, sie zu implementieren.
Wir haben gerade viel auf unserem Teller - wenn Ihnen das also in der Zwischenzeit wirklich wichtig ist - können Sie dies tun:

Erstellen Sie eine Funktion, die Datensatz _A_, Datensatz _B_ und einen _phase_-Wert zwischen 0 und 1 .
Diese Funktion wird:

  1. Definieren Sie einen neuen Datensatz _C_
  2. Iteriere jeden Wert in _A_ und setze C[i] = (B[i] - A[i]) * phase + A[i]
  3. _C_ als neuen Datensatz zurückgeben

Jetzt sollten Sie eine einfache Zahl von 0 bis 1 animieren und sie zusammen mit dem "von"-Datensatz und "bis"-Datensatz an die Funktion übergeben. Das Ergebnis sollte an die Diagrammansicht übergeben werden :-)

Sie können auch das Animations-Utility in Charts verwenden, das bereits eine Zahl für Sie animieren kann, einschließlich Easing und so weiter.

Es ist also so ziemlich ein Pfirsichkuchen, und sobald ich kann, plane ich, dies der Bibliothek hinzuzufügen. Aber zumindest hast du für die Zwischenzeit eine Lösung ;-)

Hi! Ist diese Funktion bereits implementiert?

Ich muss animieren, dem Datensatz einen neuen Wert hinzuzufügen und die Position der Grenzlinie zu ändern.

Hallo, ich versuche, die Animation der Datenänderung in einem Kreisdiagramm anzuwenden. Ich habe die von Ihnen erwähnte Funktion bereits, habe aber Schwierigkeiten, einen Weg zu finden, "eine einfache Zahl von 0 bis 1 zu animieren". Irgendwelche Gedanken dazu? Vielen Dank!

Hallo! Ist die Funktion bereits implementiert?

Ich füge meine Unterstützung für diese Funktion hinzu und suche auch nach einer guten Möglichkeit, einen einfachen Wert gemäß einer Beschleunigungsfunktion zu interpolieren (für die Problemumgehung). Alle Animationsbibliotheken scheinen mit Ansichten oder Eigenschaften zu arbeiten, aber ich möchte nur den Wert einer einfachen Zahl "animieren". Fühlt sich an, als ob es einfach sein sollte, vielleicht suche ich an den falschen Stellen?

Vielleicht möchten Sie einen Blick auf den Beitrag unten werfen, in dem ich meine Lösung geteilt habe. Ich bin mir bewusst, dass es bei weitem nicht perfekt ist, aber es scheint zu funktionieren, was schön ist. http://stackoverflow.com/questions/34730917/animating-a-double-from-0-to-1-in-swift-over-a-specified-interval/34774113#34774113

Danke für die schnelle Antwort @apiejh , wirklich zu schätzen. Ich habe es geschafft, dies mit einer Timer-Funktion zum Laufen zu bringen. Hackig, aber funktioniert! Zumindest bis ein besserer Ansatz verfügbar ist.

Irgendwelche Updates oder mögliche Lösungen dafür?

+1, ich habe ein Diagramm mit Daten und wenn ein asynchroner Prozess abgeschlossen ist, möchte ich entweder einen oder mehrere neue Datensätze hinzufügen und/oder die Datenpunkte eines Datensatzes erweitern (zB _live data_). Es wäre viel ansprechender, wenn das Diagramm diese neuen Datensätze animieren könnte, anstatt es von Grund auf neu aufzubauen.

@kevinjtchen hat gerade eine PR dafür veröffentlicht https://github.com/danielgindi/Charts/pull/2889

"Sie können auch das Animations-Utility in Charts verwenden, das bereits eine Zahl für Sie animieren kann, einschließlich Easing und so weiter."

Ich sehe keine Option, um einen einzelnen Datensatz nur das gesamte Diagramm zu animieren. Verpasse ich etwas?

Es ist über zwei Jahre her, weiß jemand wie man das umsetzt?

Wird das jemals umgesetzt? Ich würde gerne etwas so Einfaches machen wie

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

Löschen Sie einfach das Array der alten Werte und füllen Sie es mit den neuen, bevor Sie setupChart() erneut aufrufen.

Es ist bereits 2019 und gibt es eine Lösung, um Datenänderungen zu animieren, ohne das gesamte Diagramm von Grund auf neu zu zeichnen? 🙂

Es ist über zwei Jahre her, weiß jemand wie man das umsetzt?

Es ist jetzt über vier Jahre her, etwas sagt mir, dass wir das nie bekommen werden :(

Ich bin mir nicht sicher, warum die PR #2889 geschlossen ist, aber für diejenigen, die noch einige schnelle Codeschnipsel für die Danielgindis-Implementierung benötigen: https://github.com/mrjko/testCharts/blob/master/chartsTest/BarChartViewController/BarChartViewController.swift

Kennt jemand eine Möglichkeit, dies für lineChart zu tun, ich muss die Punktposition reibungslos ändern, ohne das gesamte Diagramm neu zu zeichnen.

@vittorionapoli Sie können das gleiche wie @mrjko verwenden, das oben gepostet wurde, aber ersetzen Sie es durch 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 Wie Array von yValues für gestapeltes Balkendiagramm ?
BarChartDataEntry(x: Double(index), yValues: [anArrayOfyValues])

Aktualisieren der vorgestellten Lösung mit LineChartDataSet und fügt dem DataSet neue Werte hinzu oder entfernt sie, wenn die Größe von setA und setB unterschiedlich ist.

    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
    }

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen