Charts: Barras não renderizando ou desaparecendo enquanto e após arrastar

Criado em 13 mar. 2017  ·  30Comentários  ·  Fonte: danielgindi/Charts

Eu criei um gráfico de barras usando BarChartView . A visualização exibe as horas de trabalho por dia.
Infelizmente, algumas barras não são renderizadas - e outras estão desaparecendo enquanto todo o gráfico é arrastado.

Antes de o gráfico ser mostrado pela primeira vez, ele é ampliado para mostrar apenas 7 barras por vez:

barChart.zoom(scaleX:ceil(CGFloat(dataSet.xMax - dataSet.xMin) / 7), scaleY: 1, x: 0, y: 0)

Em seguida, a visualização é animada, de modo que o último dia é mostrado primeiro:

barChart.moveViewToAnimated(xValue: dataSet.xMax, yValue: dataSet.yMin, axis: barChart.rightAxis.axisDependency, duration: 0.8, easingOption: .easeInOutSine)

Isso leva ao seguinte resultado - até agora, tudo bem:

img_2071

Assim que arrasto o gráfico para a direita, as barras começam a desaparecer - apenas o valor permanece visível (observe a barra de 6 de Mo - sumiu):

img_2072

Além disso, todas as barras que estão mais à esquerda e, portanto, não visíveis imediatamente (por causa do zoom) não são renderizadas. O que estou fazendo de errado?

help wanted ★★

Comentários muito úteis

Eu tenho o mesmo problema com 3.0.2 em um CombinedChartView com barra empilhada BarChartData() .
Ao aplicar zoom e arrastar a entrada de dados mais correta fora da visualização visível, as barras desaparecem, os rótulos de dados estão lá. Além disso, eu não restrinjo .setVisibleXRangeMaximum() nem movo o lado esquerdo via .moveViewToX() alguma.

Outro comportamento estranho é que não consigo selecionar todas as barras por meio de .highlightPerTapEnabled() , apenas a barra central em um conjunto de, por exemplo, 13 é selecionável. Não tenho certeza se isso está relacionado.

resolvido: o problema era que as entradas de dados estavam na ordem inversa. Ordenar as entradas de dados aumentando os valores x resolveu o problema.

Todos 30 comentários

Eu preciso que você depure do seu lado primeiro.
Dê uma olhada em fileprivate func prepareBuffer(dataSet: IBarChartDataSet, index: Int) , onde calcula o barRect.
Depure antes e depois do zoom, o que pode causar a falta de barRect.
Dado o fato de que algumas das barras ainda estão lá, e as posições dos rótulos parecem corretas, pode ser um simples erro da biblioteca ou de você.

Seria mais fácil se você pudesse reproduzi-lo com ChartsDemo

Consegui criar um caso de teste para o problema . Infelizmente, não consigo descobrir o que realmente causa isso.

Para executar o caso de teste, use o destino ChartsDemo no simulador iPhone 6 (10.2) do Xcode 8.2.1 . Em seguida, arraste o gráfico para a direita, você verá a barra verde de Tue 7th desaparecendo.

Vale a pena notar: o código do caso de teste é baseado nesta solicitação de pull para rótulos de gráfico atribuídos . A solicitação pull fornece a funcionalidade de renderizar os dias no xAxis, como você verá nas capturas de tela. No entanto, não consigo ver por que essa solicitação de pull deve causar o problema.

Fiz uma verificação rápida, as barras que faltam atendem à condição de quebra:

            if (!viewPortHandler.isInBoundsLeft(barRect.origin.x + barRect.size.width))
            {
                continue
            }

            if (!viewPortHandler.isInBoundsRight(barRect.origin.x))
            {
                break
            }

No entanto, não posso explicar qual é a causa. O barRect 'parece' calcula corretamente

Muito obrigado pelo seu apoio; Eu realmente gostei disso!

Pensei novamente se a solicitação de pull pode causar o problema. O que definitivamente mudou é a forma como os rótulos dos eixos são desenhados, talvez isso afete a largura do item do eixo, o que também influencia o barRect no final?

Como podemos diminuir se o problema é devido a a) um bug na solicitação de pull b) um bug na biblioteca de gráficos ou c) uso simplesmente errado?

Da última vez que verifiquei, tentei substituir a biblioteca pela master, parece que ainda está cheio de erros. Você pode substituir e ajudar a verificar.

viewPortHandler.isInBoundsRight não deve ser afetado, eu acho, contanto que o ramo do recurso não mude o cálculo do barRect.

Por enquanto, não posso dizer que você usou incorretamente, é como os problemas de borda contentRect e bar rect.

Lamento não ter muito tempo para examinar as bordas retas para descobrir o que está errado. Mas você pode tentar ChartsDemo para fazer coisas semelhantes para ver se você pode reproduzir.

@danielgindi alguma ideia?

Alguma notícia sobre a solicitação de pull ou esse problema?

Nada? Como posso ajudar a consertar isso?

@marbetschar Lembro-me da última vez que usei o branch master para esse bug, e ele ainda acontece, então não deve estar relacionado ao seu PR.

No entanto, não tenho tempo para dar uma olhada na matriz.

Acho que a questão principal aqui é por que está além da condição. Não vejo problema óbvio ao calcular o retângulo da barra.

Se você tiver tempo, pode começar a examinar o cálculo barRect.

Para ser mais específico: quando a barra está faltando, o rótulo acima dela ainda permanece na posição correta, eu suponho, então é apenas sobre os problemas da borda barRect.

Você pode tentar remover

            if (!viewPortHandler.isInBoundsLeft(barRect.origin.x + barRect.size.width))
            {
                continue
            }

            if (!viewPortHandler.isInBoundsRight(barRect.origin.x))
            {
                break
            }

E veja se a barra está na posição certa e no tamanho certo, para que possamos decidir se é apenas sobre os problemas de borda.

@marbetschar Estou tendo exatamente o mesmo problema, você encontrou uma maneira de resolvê-lo?

@jeffalee, infelizmente, ainda não tive tempo para me

@marbetschar @jeffalee esse problema está relacionado ao viewPortHandler?

Estou tendo o mesmo problema com 3.0.2, ou provavelmente parece ser o mesmo problema. Agradeceria ajuda nisso.

self.chartView.data = getChartData() // .count == 25
self.chartView.setVisibleXRangeMaximum(10) 
self.chartView.moveViewToX(20)

Apenas as últimas 10 barras de dados são renderizadas / exibidas quando eu rolar para a esquerda e para a direita.

  • Quando a última barra está fora dos limites, o valor da barra desaparece e
  • Quando o último está fora dos limites, todas as barras desenhadas desapareceram.
  • O rótulo xAxis permaneceu

Se eu remover as últimas 2 linhas, o gráfico será renderizado corretamente.

@perwyl eu tenho exatamente as mesmas duas linhas em meu código; então eu diria que você teve o mesmo problema. @ liuxuan30 investigou um pouco e descobriu que isso está de fato relacionado com viewPortHandler .

Infelizmente, não tenho tempo para me aprofundar nisso atualmente. Ficaria muito grato se você tentar.

@marbetschar tudo bem. Obrigado pela confirmação.

Eu tenho o mesmo problema com 3.0.2 em um CombinedChartView com barra empilhada BarChartData() .
Ao aplicar zoom e arrastar a entrada de dados mais correta fora da visualização visível, as barras desaparecem, os rótulos de dados estão lá. Além disso, eu não restrinjo .setVisibleXRangeMaximum() nem movo o lado esquerdo via .moveViewToX() alguma.

Outro comportamento estranho é que não consigo selecionar todas as barras por meio de .highlightPerTapEnabled() , apenas a barra central em um conjunto de, por exemplo, 13 é selecionável. Não tenho certeza se isso está relacionado.

resolvido: o problema era que as entradas de dados estavam na ordem inversa. Ordenar as entradas de dados aumentando os valores x resolveu o problema.

@kscheff qual problema você disse ter resolvido? Apenas seu ou @marbetschar também?

@ liuxuan30 Não consegui verificar @marbetschar o problema dele. Só vi que tenho um problema semelhante com barras ausentes, que poderia resolver classificando os valores. Portanto, sugiro @marbetschar tentando classificar suas entradas no conjunto de dados.

Obrigado entendi

@kscheff como você resolve

 Another strange behavior is that I cannot select all bars via .highlightPerTapEnabled(), only the center bar in a set of e.g. 13 is selectable. Not sure if this is related at all.

@perwyl, esse problema também desapareceu com a classificação.

@kscheff obrigado! eu realmente preciso fazer return yVals.reversed() não tenho certeza qual é a lógica por trás disso.

É ótimo que os dados de ordenação tornem os gráficos plotados corretamente durante o zoom. A ação de classificação pode ser incluída no pod por padrão no método "notificarDataSetChanged" ou talvez em outro lugar? Devo fazer RP?

Por favor, faça um PR com detalhes como qual é o problema e a causa raiz, etc. Este tem sido um bom tempo e conversas, não tenho certeza se são o mesmo problema com esta postagem.

Acho que se vamos fazer isso (e acho que devemos), a única maneira de adicionar dados deve ser de forma ordenada.

classificação ou esse problema? A classificação costumava ser feita pelo usuário que eu me lembro.

classificação ou esse problema? A classificação costumava ser feita pelo usuário que eu me lembro.

a meu ver, isso causa a representação incorreta dos dados no gráfico - então parece que não é óbvio preparar os dados classificados (tem o valor x - então é definida a condição necessária e suficiente para desenhar corretamente). Então, talvez o pod deva ser autossuficiente e não exigir requisitos não óbvios? Na minha humilde opinião
Vou preparar o PR em alguns dias, espero que essa lógica seja óbvia.

Embora eu trabalhe apenas com um gráfico de barras. Talvez algum tipo de gráfico possa ser afetado. Mas realmente não entendo como isso poderia desenhar direito em primeiro lugar e tenho problemas com o desenho de parte ampliada do gráfico da perspectiva lógica.

@ liuxuan30 Meu entendimento é que esse problema é resultado da

Estou supondo aqui, mas se os dados estão sempre classificados, provavelmente também podemos fazer suposições na renderização para melhorar o desempenho.

Sinceramente, não me lembro. A última vez que pesquisei foi que encontrei

if (!viewPortHandler.isInBoundsLeft(barRect.origin.x + barRect.size.width))
            {
                continue
            }

            if (!viewPortHandler.isInBoundsRight(barRect.origin.x))
            {
                break
            }

uma das duas condições não é atendida, portanto as barras não são renderizadas. @marbetschar não foi atualizado desde então, então não tenho certeza se a causa raiz do problema original está relacionada à classificação, como o que @kscheff ofereceu.

Ei pessoal! Alguma notícia sobre este assunto? Usando a versão 3.3.0 e ainda com o mesmo problema com BarChartView. Alguma idéia de como consertá-lo caso seja importante não classificar os valores do yAxis?

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

Questões relacionadas

brytnvmg picture brytnvmg  ·  4Comentários

newbiebie picture newbiebie  ·  3Comentários

anhltse03448 picture anhltse03448  ·  3Comentários

ahmedsafadii picture ahmedsafadii  ·  3Comentários

Bharati555 picture Bharati555  ·  4Comentários