Charts: Las barras no se procesan o desaparecen mientras se arrastra

Creado en 13 mar. 2017  ·  30Comentarios  ·  Fuente: danielgindi/Charts

Creé un gráfico de barras usando BarChartView . La vista muestra las horas de trabajo por día.
Desafortunadamente, algunas barras no se renderizan en absoluto, y otras desaparecen mientras se arrastra todo el gráfico.

Antes de que se muestre el gráfico por primera vez, se amplía para mostrar solo 7 barras a la vez:

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

Luego, la vista se anima, por lo que el último día se muestra primero:

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

Esto conduce al siguiente resultado, hasta ahora, todo bien:

img_2071

Tan pronto como arrastro el gráfico hacia la derecha, las barras comienzan a desaparecer, solo el valor permanece visible (observe la barra del 6 de mes, ya no está):

img_2072

Además, todas las barras que están más a la izquierda y, por lo tanto, no son visibles inmediatamente (debido al zoom) no se renderizan en absoluto. ¿Qué estoy haciendo mal?

help wanted ★★

Comentario más útil

Tengo el mismo problema con 3.0.2 en un CombinedChartView con barra apilada BarChartData() .
Al hacer zoom y arrastrar la entrada de datos más a la derecha fuera de la vista visible, las barras desaparecen, las etiquetas de datos están ahí. Además, no restrinjo .setVisibleXRangeMaximum() ni muevo el lado izquierdo a través de .moveViewToX() en absoluto.

Otro comportamiento extraño es que no puedo seleccionar todas las barras a través de .highlightPerTapEnabled() , solo se puede seleccionar la barra central en un conjunto de, por ejemplo, 13. No estoy seguro de si esto está relacionado en absoluto.

resuelto: El problema era que las entradas de datos estaban en orden inverso. Ordenar las entradas de datos aumentando los valores de x resolvió el problema.

Todos 30 comentarios

Primero necesito que depures de tu lado.
Eche un vistazo a fileprivate func prepareBuffer(dataSet: IBarChartDataSet, index: Int) , donde calcula barRect.
Depurar antes y después del zoom, lo que podría causar la falta barRect.
Dado el hecho de que algunas de las barras todavía están allí, y las posiciones de las etiquetas parecen correctas, podría ser un simple error de la biblioteca o de usted.

Sería más fácil si pudieras reproducirlo con ChartsDemo

Pude crear un caso de prueba para el problema . Desafortunadamente, no puedo averiguar qué lo causa realmente.

Para ejecutar el caso de prueba, use el objetivo ChartsDemo en el simulador iPhone 6 (10.2) de Xcode 8.2.1 . Luego arrastre el gráfico hacia la derecha, verá desaparecer la barra verde de Tue 7th .

Vale la pena señalar: el código del caso de prueba se basa en esta solicitud de extracción para etiquetas de gráficos atribuidos . La solicitud de extracción proporciona la funcionalidad de representar los días en el xAxis, como verá en las capturas de pantalla. Sin embargo, no veo por qué esta solicitud de extracción debería causar el problema.

Hice una comprobación rápida, todas las barras que faltan cumplen la condición de rotura:

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

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

Sin embargo, no puedo explicar cuál es la causa. El barRect 'parece' calcula correctamente

Muchas gracias por tu apoyo; ¡Realmente lo aprecio!

Pensé de nuevo si la solicitud de extracción puede causar el problema. Lo que definitivamente ha cambiado es la forma en que se dibujan las etiquetas de los ejes, tal vez eso afecta el ancho del elemento del eje, que también influye en la barraRect al final

¿Cómo podemos reducir si el problema se debe a a) un error en la solicitud de extracción b) un error en la biblioteca de gráficos oc) simplemente un uso incorrecto?

La última vez que lo comprobé, intenté reemplazar la biblioteca con master, todavía parece tener errores. Puede reemplazar y ayudar a verificar.

viewPortHandler.isInBoundsRight no debería verse afectado, supongo, siempre que la rama de la función no cambie el cálculo de barRect.

Por ahora, no puedo decir que lo haya usado incorrectamente, es como los problemas de contentRect y bar rect edge.

Lo siento, no tengo mucho tiempo para mirar los bordes rectos para averiguar qué está mal. Pero puede probar ChartsDemo para hacer cosas similares para ver si puede reproducir.

@danielgindi ¿ alguna idea?

¿Alguna noticia sobre la solicitud de extracción o este problema?

¿Cualquier cosa? ¿Cómo puedo ayudar a solucionar este problema?

@marbetschar Recuerdo la última vez que

Sin embargo, no tengo tiempo para echar un vistazo a la matriz.

Creo que la cuestión clave aquí es por qué está más allá de la condición. No veo un problema obvio al calcular la barra recta.

Si tiene tiempo, puede comenzar a mirar el cálculo de barRect.

Para ser más específico: cuando falta la barra, la etiqueta de arriba todavía permanece en la posición correcta, supongo, por lo que se trata solo de los problemas del borde barRect.

Puedes intentar eliminar

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

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

Y vea si la barra está en la posición correcta y el tamaño correcto, para que podamos decidir si solo se trata de los problemas de los bordes.

@marbetschar Tengo exactamente el mismo problema, ¿encontraste una manera de resolverlo?

@jeffalee, lamentablemente,

@marbetschar @jeffalee ¿este problema está relacionado con viewPortHandler?

Tengo el mismo problema con 3.0.2, o probablemente parece ser el mismo problema. Agradecería ayuda en esto.

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

Solo se representan / muestran las últimas 10 barras de datos cuando me desplazo hacia la izquierda y hacia la derecha.

  • Cuando la última barra va a estar fuera de los límites, el valor de la barra se desvanece y
  • Cuando el último está fuera de límites, todas las barras dibujadas desaparecieron.
  • La etiqueta xAxis permaneció

Si elimino las últimas 2 líneas, el gráfico se representa correctamente.

@perwyl Tengo exactamente las mismas dos líneas en mi código; por lo que diría que se encontró con el mismo problema. @ liuxuan30 investigó un poco y descubrió que esto está relacionado con el viewPortHandler .

Desafortunadamente, no tengo tiempo para investigar esto actualmente. Estaría agradecido si lo probaras.

@marbetschar está bien. gracias por la confirmación.

Tengo el mismo problema con 3.0.2 en un CombinedChartView con barra apilada BarChartData() .
Al hacer zoom y arrastrar la entrada de datos más a la derecha fuera de la vista visible, las barras desaparecen, las etiquetas de datos están ahí. Además, no restrinjo .setVisibleXRangeMaximum() ni muevo el lado izquierdo a través de .moveViewToX() en absoluto.

Otro comportamiento extraño es que no puedo seleccionar todas las barras a través de .highlightPerTapEnabled() , solo se puede seleccionar la barra central en un conjunto de, por ejemplo, 13. No estoy seguro de si esto está relacionado en absoluto.

resuelto: El problema era que las entradas de datos estaban en orden inverso. Ordenar las entradas de datos aumentando los valores de x resolvió el problema.

@kscheff ¿Qué problema dijiste resuelto? ¿Solo tuyo o @marbetschar también?

@ liuxuan30 No pude verificar @marbetschar su problema. Solo vi que tengo un problema similar con las barras faltantes, que pude resolver ordenando los valores. Así que le sugiero a @marbetschar que intente ordenar sus entradas en el conjunto de datos.

Gracias lo tengo

@kscheff ¿cómo se resuelve?

 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, este problema también desapareció con la clasificación.

@kscheff gracias! De hecho, necesito hacer return yVals.reversed() No estoy seguro de cuál es la lógica detrás de esto.

Es genial que los datos de pedido hagan que los gráficos se tracen correctamente mientras se hace zoom. ¿Se podría incluir la acción de clasificación en el pod de forma predeterminada en el método "notifyDataSetChanged" o tal vez en el otro lugar? ¿Debería hacer relaciones públicas?

Haga un PR con detalles como cuál es el problema y la causa raíz, etc. Este ha sido bastante tiempo y conversaciones, no estoy seguro de si son el mismo problema con esta publicación.

Creo que si vamos a hacer esto (y creo que deberíamos hacerlo), la única forma de agregar datos debería ser de forma ordenada.

clasificación o este problema? La clasificación solía estar a cargo del usuario que recuerdo.

clasificación o este problema? La clasificación solía estar a cargo del usuario que recuerdo.

como veo, causa la representación incorrecta de los datos en el gráfico, por lo que parece que no es obvio preparar los datos ordenados (tiene un valor x, por lo que se define la condición necesaria y suficiente para dibujar correctamente). Entonces, ¿tal vez pod debería ser autosuficiente y no requerir requisitos no obvios? En mi humilde opinión
Prepararé relaciones públicas en un par de días, espero que esta lógica sea obvia.

Aunque trabajo solo con un gráfico de barras. Quizás algún tipo de gráficos podría verse afectado. Pero realmente no entiendo cómo podría dibujar bien en primer lugar y tengo problemas para dibujar la parte ampliada del gráfico desde la perspectiva lógica.

@ liuxuan30 Tengo entendido que este problema es el resultado de tener los datos sin clasificar. ¿Me estoy perdiendo de algo?

Supongo que aquí, pero si los datos siempre están ordenados, es probable que también podamos hacer suposiciones en el renderizado para mejorar el rendimiento.

Sinceramente, no lo recuerdo. La última vez que miré es que encontré

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

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

una de las dos condiciones no se cumple, por lo que las barras no se renderizan. @marbetschar no se actualizó desde entonces, por lo que no estoy seguro de si la causa raíz del problema original está relacionada con la clasificación, como lo que ofreció @kscheff .

¡Hola, chicos! ¿Alguna noticia sobre este tema? Usando la versión 3.3.0 y sigue teniendo el mismo problema con BarChartView. ¿Alguna idea de cómo solucionarlo en caso de que sea importante no ordenar los valores de yAxis?

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

Temas relacionados

valeIT picture valeIT  ·  3Comentarios

ahmedsafadii picture ahmedsafadii  ·  3Comentarios

kirti0525 picture kirti0525  ·  3Comentarios

sjdevlin picture sjdevlin  ·  3Comentarios

Bharati555 picture Bharati555  ·  4Comentarios