Charts: Atualização animada

Criado em 7 jul. 2015  ·  21Comentários  ·  Fonte: danielgindi/Charts

Oi!
Existe uma maneira de atualizar os dados LineChartView (ChartData) e redesenhar LineChartView animado da posição atual.
Como no aplicativo appFigures.
Obrigado.

idea

Comentários muito úteis

Já se passaram mais de dois anos, alguém sabe como implementar isso?

Todos 21 comentários

Na verdade, esse é um recurso que já pensei e estou planejando implementar.
Temos muito o que fazer agora - então, por enquanto, se isso for realmente importante para você - você pode fazer o seguinte:

Crie uma função que use dataset _A_, dataset _B_ e um valor _phase_ entre 0 e 1 .
Esta função irá:

  1. Defina um novo conjunto de dados _C_
  2. Repita cada valor em _A_ e defina C[i] = (B[i] - A[i]) * phase + A[i]
  3. Retorne _C_ como o novo conjunto de dados

Agora você deve animar um número simples de 0 a 1 e passá-lo para a função junto com o conjunto de dados "de" e "para". O resultado deve ser passado para a visualização do gráfico :-)

Você também pode usar o utilitário de animação em gráficos, que pode animar um número para você, incluindo easing e outras coisas.

Portanto, é praticamente um bolo de pêssego e, assim que puder, estou planejando adicioná-lo à biblioteca. Mas pelo menos você tem uma solução por enquanto ;-)

Oi! Esse recurso já está implementado?

Eu preciso animar adicionando um novo valor ao conjunto de dados e mudando a posição da linha limite.

Oi, estou tentando aplicar a animação de alteração de dados em um gráfico de pizza. Já tenho a função que você mencionou, mas estou lutando para encontrar uma maneira de "animar um número simples de 0 a 1". Alguma opinião sobre isso? Obrigado!

Olá! O recurso já está implementado?

Adicionando meu suporte para este recurso, e também procurando uma boa maneira de interpolar um valor simples de acordo com alguma função de atenuação (para a solução alternativa). Todas as bibliotecas de animação parecem operar em visualizações ou propriedades, mas eu só quero "animar" o valor de um número simples. Parece que deveria ser simples, talvez eu esteja procurando nos lugares errados?

Você pode querer dar uma olhada no post abaixo, onde compartilhei minha solução. Estou ciente de que está longe de ser perfeito, mas parece estar funcionando, o que é bom. http://stackoverflow.com/questions/34730917/animating-a-double-from-0-to-1-in-swift-over-a-specified-interval/34774113#34774113

Obrigado pela resposta rápida @apiejh , realmente agradeço. Consegui fazer isso funcionar com uma função de temporizador. Hacky, mas funciona! Pelo menos até que uma abordagem melhor esteja disponível.

Quaisquer atualizações ou soluções possíveis para isso?

+1, eu tenho um gráfico com dados e quando algum processo assíncrono for concluído, gostaria de adicionar um ou mais novos conjuntos de dados e / ou estender os pontos de dados de um conjunto de dados (por exemplo, _dados ao vivo_). Seria muito mais atraente se o gráfico pudesse animar esses novos conjuntos de dados em vez de reconstruí-los do zero.

@kevinjtchen acaba de lançar um PR para este https://github.com/danielgindi/Charts/pull/2889

"Você também pode usar o utilitário de animação em gráficos, que pode animar um número para você, incluindo easing e outras coisas."

Não vejo nenhuma opção para animar um único conjunto de dados apenas o gráfico inteiro. Estou esquecendo de algo?

Já se passaram mais de dois anos, alguém sabe como implementar isso?

Isso algum dia será implementado? Eu adoraria ser capaz de fazer algo tão simples como

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

Apenas limpe a matriz de valores antigos e preencha com os novos antes de chamar novamente o setupChart ()

Já estamos em 2019 e existe uma solução para animar alterações de dados sem redesenhar todo o gráfico do zero? 🙂

Já se passaram mais de dois anos, alguém sabe como implementar isso?

Já se passaram mais de quatro anos, algo me diz que nunca vamos conseguir isso :(

não tenho certeza por que o PR # 2889 foi fechado, mas para aqueles que ainda querem alguns snippets de código rápidos para implementação de danielgindis: https://github.com/mrjko/testCharts/blob/master/chartsTest/BarChartViewController/BarChartViewController.swift

Alguém conhece uma maneira de fazer isso para lineChart, eu tenho que mudar a posição do ponto suavemente sem redesenhar o gráfico inteiro.

@vittorionapoli Você pode usar o mesmo que @mrjko postado acima, mas substitua-o por 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 Como o método acima funcionará para uma matriz de yValues para o gráfico de barras empilhadas ?
BarChartDataEntry(x: Double(index), yValues: [anArrayOfyValues])

Atualizando a solução apresentada com LineChartDataSet e também adiciona / remove novos valores do dataSet se o tamanho de setA e setB for 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
    }

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

Bharati555 picture Bharati555  ·  4Comentários

newbiebie picture newbiebie  ·  3Comentários

Shunshine07 picture Shunshine07  ·  3Comentários

Aungbandlab picture Aungbandlab  ·  4Comentários

coop44483 picture coop44483  ·  3Comentários