Charts: Les barres ne sont pas rendues ou disparaissent pendant et après le déplacement

Créé le 13 mars 2017  ·  30Commentaires  ·  Source: danielgindi/Charts

J'ai créé un graphique à barres en utilisant BarChartView . La vue affiche les heures de travail par jour.
Malheureusement, certaines barres ne sont pas du tout rendues - et d'autres disparaissent lorsque le graphique entier est déplacé.

Avant que le graphique ne s'affiche pour la première fois, il est zoomé pour n'afficher que 7 barres à la fois:

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

Ensuite, la vue est animée, de sorte que le dernier jour est affiché en premier:

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

Cela conduit au résultat suivant - jusqu'à présent, tout va bien:

img_2071

Dès que je fais glisser le graphique vers la droite, les barres commencent à disparaître - seule la valeur reste visible (remarquez la barre du 6 Mo - c'est parti):

img_2072

De plus, toutes les barres qui sont plus à gauche et donc non visibles immédiatement (à cause du zoom) ne sont pas du tout rendues. Qu'est-ce que je fais de mal?

help wanted ★★

Commentaire le plus utile

J'ai le même problème avec 3.0.2 dans un CombinedChartView avec une barre empilée BarChartData() .
Lorsque vous zoomez et faites glisser l'entrée de données la plus à droite en dehors de la vue visible, les barres disparaissent, les étiquettes de données sont là. De plus, je ne limite pas .setVisibleXRangeMaximum() ou ne déplace pas du tout le côté gauche via .moveViewToX() .

Un autre comportement étrange est que je ne peux pas sélectionner toutes les barres via .highlightPerTapEnabled() , seule la barre centrale dans un ensemble de 13 par exemple est sélectionnable. Je ne sais pas si cela est lié du tout.

résolu: Le problème était que les entrées de données étaient dans l'ordre inverse. La commande des entrées de données en augmentant les valeurs de x a résolu le problème.

Tous les 30 commentaires

J'ai besoin que vous déboguiez d'abord de votre côté.
Jetez un œil à fileprivate func prepareBuffer(dataSet: IBarChartDataSet, index: Int) , où il calcule le barRect.
Veuillez déboguer avant et après le zoom, ce qui pourrait causer l'absence de barRect.
Étant donné que certaines des barres sont toujours là et que les positions des étiquettes semblent correctes, cela pourrait être une simple erreur de la part de la bibliothèque ou de vous.

Ce serait plus facile si vous pouviez le reproduire avec ChartsDemo

J'ai pu créer un scénario de test pour le problème . Malheureusement, je ne peux pas comprendre ce qui la cause réellement.

Pour exécuter le scénario de test, utilisez la cible ChartsDemo dans le simulateur iPhone 6 (10.2) de Xcode 8.2.1 . Faites ensuite glisser le graphique vers la droite, vous verrez la barre verte de Tue 7th disparaître.

À noter: le code du scénario de test est basé sur cette pull request pour les étiquettes de graphique attribuées . La demande d'extraction fournit la fonctionnalité de rendu des jours sur le xAxis comme vous le verrez sur les captures d'écran. Cependant, je ne vois pas pourquoi cette demande d'extraction devrait causer des problèmes.

J'ai fait une vérification rapide, les barres manquantes remplissent toutes la condition de rupture:

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

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

Cependant, je ne peux pas expliquer quelle est la cause. Le barRect `` semble '' calcule correctement

Merci beaucoup pour votre soutient; J'apprécie vraiment cela!

Réfléchi à nouveau si la demande d'extraction peut causer le problème. Ce qui a définitivement changé, c'est la façon dont les étiquettes des axes sont dessinées, peut-être que cela affecte la largeur de l'élément de l'axe, qui influence également la barreRect à la fin?

Comment pouvons-nous affiner si le problème est dû à a) un bogue dans la demande d'extraction b) un bogue dans la bibliothèque de graphiques ou c) tout simplement une mauvaise utilisation?

La dernière fois que j'ai vérifié, j'ai essayé de remplacer la bibliothèque par master, cela semble encore bogué. Vous pouvez remplacer et aider à vérifier.

viewPortHandler.isInBoundsRight ne devrait pas être affecté je suppose, tant que la branche de fonctionnalité ne change pas le calcul de barRect.

Pour l'instant, je ne peux pas dire que vous l'avez mal utilisé, c'est comme les problèmes contentRect et bar rect edge.

Je suis désolé de ne pas avoir beaucoup de temps pour regarder dans les bords droits pour comprendre ce qui ne va pas. Mais vous pouvez essayer ChartsDemo pour faire des choses similaires pour voir si vous pouvez reproduire.

@danielgindi une idée?

Des nouvelles concernant la pull request ou ce problème?

N'importe quoi? Comment puis-je aider à résoudre ce problème?

@marbetschar Je me souviens de la dernière fois que j'utilise la branche master pour ce bogue, et cela se produit toujours, donc ne devrait pas être lié à votre PR.

Cependant, je n'ai pas le temps de jeter un œil à la matrice.

Je pense que la question clé ici est de savoir pourquoi c'est au-delà de la condition. Je ne vois pas de problème évident lors du calcul de la barre droite.

Si vous avez le temps, vous pouvez commencer à regarder le calcul barRect.

Pour être plus précis: lorsque la barre est manquante, l'étiquette au-dessus reste toujours à la bonne position, je suppose, il ne s'agit donc que des problèmes de bord barRect.

Vous pouvez essayer de supprimer

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

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

Et voyez si la barre est à la bonne position et à la bonne taille, afin que nous puissions décider s'il ne s'agit que des problèmes de bord.

@marbetschar J'ai exactement le même problème,

@jeffalee, malheureusement, je n'ai pas encore eu le temps de creuser ce problème

@marbetschar @jeffalee Ce problème est-il lié au viewPortHandler?

J'ai le même problème avec la version 3.0.2, ou probablement, il semble que ce soit le même problème. J'apprécierais de l'aide à ce sujet.

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

Seules les 10 dernières barres de données sont rendues / affichées lorsque je fais défiler vers la gauche et la droite.

  • Lorsque la dernière mesure est hors limites, la valeur de la mesure disparaît et
  • Lorsque la dernière est hors limites, toutes les barres dessinées ont disparu.
  • Le label xAxis est resté

Si je supprime les 2 dernières lignes, le graphique est rendu correctement.

@perwyl J'ai exactement les mêmes deux lignes dans mon code; donc je dirais que vous avez rencontré le même problème. @ liuxuan30 a enquêté un peu et a découvert que cela était en effet lié au viewPortHandler .

Malheureusement, je n'ai pas le temps de creuser dans cela actuellement. Je vous serais reconnaissant si vous l'essayez.

@marbetschar d' accord. Merçi pour la confirmation.

J'ai le même problème avec 3.0.2 dans un CombinedChartView avec une barre empilée BarChartData() .
Lorsque vous zoomez et faites glisser l'entrée de données la plus à droite en dehors de la vue visible, les barres disparaissent, les étiquettes de données sont là. De plus, je ne limite pas .setVisibleXRangeMaximum() ou ne déplace pas du tout le côté gauche via .moveViewToX() .

Un autre comportement étrange est que je ne peux pas sélectionner toutes les barres via .highlightPerTapEnabled() , seule la barre centrale dans un ensemble de 13 par exemple est sélectionnable. Je ne sais pas si cela est lié du tout.

résolu: Le problème était que les entrées de données étaient dans l'ordre inverse. La commande des entrées de données en augmentant les valeurs de x a résolu le problème.

@kscheff quel problème avez-vous dit résolu? Vôtre uniquement ou @marbetschar également?

@ liuxuan30 Je n'ai pas pu vérifier @marbetschar son problème. J'ai seulement vu que j'avais un problème similaire avec des barres manquantes, que je pourrais résoudre en triant les valeurs. Je suggère donc à @marbetschar d' essayer de trier ses entrées dans l'ensemble de données.

Merci, compris

@kscheff comment

 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, ce problème a également disparu avec le tri.

@kscheff merci! J'ai en fait besoin de faire return yVals.reversed() je ne sais pas quelle est la logique derrière cela.

C'est génial que les données de commande permettent aux graphiques de tracer correctement tout en zoomant. L'action de tri pourrait-elle être incluse dans le pod par défaut dans la méthode "notifyDataSetChanged" ou peut-être à l'autre endroit? Dois-je faire des relations publiques?

Veuillez faire un PR avec des détails comme quel est le problème et la cause profonde, etc. Cela a été un certain temps et des conversations, je ne sais pas si c'est le même problème avec ce message.

Je pense que si nous allons faire cela (et je pense que nous devrions le faire), la seule façon d'ajouter des données devrait être de manière ordonnée.

tri ou ce problème? Autrefois, le tri était pris en charge par l'utilisateur dont je me souviens.

tri ou ce problème? Autrefois, le tri était pris en charge par l'utilisateur dont je me souviens.

comme je le vois, cela provoque une mauvaise représentation des données dans le graphique - il semble donc qu'il n'est pas évident de préparer des données triées (elles ont une valeur x - elles sont donc définies comme la condition nécessaire et suffisante pour dessiner correctement). Alors peut-être que le pod devrait être autonome et ne pas nécessiter d'exigences non évidentes? A mon humble avis
Je préparerai les relations publiques dans quelques jours, j'espère que cette logique est évidente.

Bien que je travaille uniquement avec un graphique à barres. Peut-être que certains types de graphiques pourraient être affectés. Mais vraiment, je ne comprends pas comment il pourrait dessiner correctement en premier et avoir des problèmes avec le dessin d'une partie agrandie du graphique du point de vue logique.

@ liuxuan30 Je crois comprendre que ce problème résulte du fait que les données ne sont pas triées. Est-ce que je manque quelque chose?

Je suppose ici, mais si les données sont toujours triées, nous pouvons probablement également faire des hypothèses dans le rendu pour améliorer les performances.

Honnêtement, je ne m'en souviens pas. La dernière fois que j'ai regardé, j'ai trouvé

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

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

l'une des deux conditions n'est pas remplie donc les barres ne sont pas rendues. @marbetschar n'a pas été mis à jour depuis, donc je ne suis pas sûr que la cause première du problème d' que propose

Salut les gars! Des nouvelles de ce problème? Utilisation de la version 3.3.0 et toujours le même problème avec BarChartView. Des idées pour y remédier au cas où il serait important de ne pas trier les valeurs yAxis?

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

cilasgimenez picture cilasgimenez  ·  4Commentaires

coop44483 picture coop44483  ·  3Commentaires

ahmedsafadii picture ahmedsafadii  ·  3Commentaires

BrandonShega picture BrandonShega  ·  4Commentaires

Aungbandlab picture Aungbandlab  ·  4Commentaires