Charts: Actualización animada

Creado en 7 jul. 2015  ·  21Comentarios  ·  Fuente: danielgindi/Charts

¡Hola!
¿Hay alguna manera de actualizar los datos de LineChartView (ChartData) y volver a dibujar LineChartView animado desde la posición actual?
Como en la aplicación appFigures.
Gracias.

idea

Comentario más útil

Han pasado más de dos años, ¿alguien sabe cómo implementar esto?

Todos 21 comentarios

En realidad, esta es una característica en la que ya pensé y planeo implementar.
Tenemos mucho en nuestro plato en este momento, así que mientras tanto, si esto es realmente importante para usted, puede hacer esto:

Cree una función que tome el conjunto de datos _A_, el conjunto de datos _B_ y un valor _fase_ entre 0 y 1 .
Esta función:

  1. Definir un nuevo conjunto de datos _C_
  2. Itere cada valor en _A_ y establezca C[i] = (B[i] - A[i]) * phase + A[i]
  3. Devuelve _C_ como el nuevo conjunto de datos

Ahora debe animar un número simple de 0 a 1 , y pasarlo a la función junto con el conjunto de datos "from" y "to". El resultado debe pasarse a la vista de gráfico :-)

También puede usar la utilidad de animación en Gráficos, que ya puede animar un número para usted, incluida la aceleración y demás.

Así que es prácticamente un melocotón de pastel, y tan pronto como pueda, planeo agregar esto a la biblioteca. Pero al menos tienes una solución mientras tanto ;-)

¡Hola! ¿Esta característica ya está implementada?

Necesito animar agregando un nuevo valor al conjunto de datos y cambiando la posición de la línea límite.

Hola, estoy intentando aplicar la animación del cambio de datos en un gráfico circular. Ya tengo la función que mencionaste, pero estoy luchando por encontrar una manera de "animar un número simple de 0 a 1". Tiene alguna idea sobre esto? ¡Gracias!

¡Hola! ¿La función ya está implementada?

Agregando mi soporte para esta función, y también buscando una buena manera de interpolar un valor simple de acuerdo con alguna función de aceleración (para la solución). Todas las bibliotecas de animación parecen operar en vistas o propiedades, pero solo quiero "animar" el valor de un número simple. Parece que debería ser simple, ¿tal vez estoy buscando en los lugares equivocados?

Es posible que desee echar un vistazo a la publicación a continuación donde he compartido mi solución. Soy consciente de que está lejos de ser perfecto, pero parece estar funcionando, lo cual es bueno. http://stackoverflow.com/questions/34730917/animating-a-double-from-0-to-1-in-swift-over-a-specified-interval/34774113#34774113

Gracias por la rápida respuesta @apiejh , realmente lo aprecio. Me las arreglé para que esto funcionara con una función de temporizador. Hacky, ¡pero funciona! Al menos hasta que se disponga de un enfoque mejor.

¿Alguna actualización o posible solución para esto?

+1, tengo un gráfico con datos y cuando se completa algún proceso asincrónico, me gustaría agregar uno o más conjuntos de datos nuevos y / o extender los puntos de datos de un conjunto de datos (por ejemplo, _datos en vivo_). Sería mucho más agradable a la vista si el gráfico pudiera animar esos nuevos conjuntos de datos en lugar de reconstruirlos desde cero.

@kevinjtchen acaba de publicar un PR para esto https://github.com/danielgindi/Charts/pull/2889

"También puede utilizar la utilidad de animación en Gráficos, que ya puede animar un número para usted, incluida la aceleración y demás".

No veo ninguna opción para animar un solo conjunto de datos, solo el gráfico completo. ¿Me estoy perdiendo de algo?

Han pasado más de dos años, ¿alguien sabe cómo implementar esto?

¿Se va a implementar esto alguna vez? Me encantaría poder hacer algo tan simple como

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

Simplemente borre la matriz de valores antiguos y rellénela con los nuevos antes de volver a llamar al setupChart ()

Ya estamos en 2019 y ¿existe una solución para animar los cambios de datos sin volver a dibujar todo el gráfico desde cero? 🙂

Han pasado más de dos años, ¿alguien sabe cómo implementar esto?

Han pasado más de cuatro años, algo me dice que nunca obtendremos esto :(

No estoy seguro de por qué el PR # 2889 está cerrado, pero para aquellos que aún quieren algunos fragmentos de código rápidos para la implementación de danielgindis: https://github.com/mrjko/testCharts/blob/master/chartsTest/BarChartViewController/BarChartViewController.swift

¿Alguien sabe una forma de hacer esto para lineChart? Tengo que cambiar la posición de los puntos sin problemas sin volver a dibujar todo el gráfico.

@vittorionapoli Puede usar lo mismo que @mrjko publicado anteriormente, pero reemplácelo con 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 ¿Cómo funcionará el método anterior para una matriz de yValues para el gráfico de barras apiladas ?
BarChartDataEntry(x: Double(index), yValues: [anArrayOfyValues])

Actualizando la solución presentada con LineChartDataSet y también agrega / elimina nuevos valores del conjunto de datos si el tamaño de setA y setB es diferente.

    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
    }

¿Fue útil esta página
0 / 5 - 0 calificaciones