Charts: (v3.0 + Swift3.0) ChartView highlightValueWithX ne fonctionne pas

Créé le 20 sept. 2016  ·  23Commentaires  ·  Source: danielgindi/Charts

La méthode ChartView highlightValueWithX semble cesser de fonctionner pour v3.0 + Swift3.0
Xcode 8 / Branche principale / Objc.

bug ★★★

Commentaire le plus utile

Modifiez cette ligne: lineChartView.highlightValue (x: 3, dataSetIndex: 0)

à: lineChartView.highlightValue (Highlight (x: 3, y: 0, dataSetIndex: 0)

Tous les 23 commentaires

Les fonctions @PhilJay highlightValue(x...) échouent, car le moteur de rendu de surbrillance s'attend à ce qu'une valeur Y soit présente. Le résultat est un NaN, ce qui ne le rend nulle part ...

Android et iOS?

Oui...

Hmmm ... je viens de regarder le code, c'est une question délicate. Dans le cas où nous avons plusieurs entrées sur la même position x, il ne sera pas possible de mettre en évidence avec succès une certaine entrée sans aucune spécification de la position y.

Alors peut-être devrions-nous abandonner cette méthode?
Une autre option serait d'inclure la position y dans la méthode (en tant que paramètre)?

Eh bien, le problème commence avec la sélection à partir d'événements tactiles - cela ne fonctionne toujours pas vraiment, si vous avez un nuage de points ou des graphiques à bulles avec plusieurs valeurs sur le même x. Il sélectionne en fait le premier ou le dernier sur le même x - en fonction de la position du toucher sur l'axe X!

Après avoir corrigé cela - je suppose que l'algorithme saura prendre une valeur Y et après avoir atteint le bon X, il commencera à rechercher le bon Y.
Et puis nous aurons la possibilité de passer une valeur Y, comme méthode séparée! :-)
L'original, à mettre en évidence simplement par un X est très utile et beaucoup de gens en dépendent, à en juger par les problèmes ... Nous recevrons donc des courriers haineux si nous supprimons cela :-)

Existe-t-il une solution actuelle pour mettre en évidence par programme un élément de graphique en courbes? Toutes les méthodes de mise en évidence sont-elles cassées pour le moment?

Le graphique linéaire

La mise en évidence par programme ne fonctionne toujours pas dans les graphiques en courbes.

J'essaye de mettre en évidence la dernière valeur:

[self.lineChartView highlightValueWithX:self.lineChartView.chartXMax dataSetIndex:0 callDelegate:YES];

Mais dans la méthode déléguée - (void) chartValu eSelected: entry : highlight: highlight.xPx et highlight.yPx sont NaN.

Je peux reconfirmer que highlightValueWithX ne fonctionne pas.

J'ai essayé de créer un point culminant
ChartHighlight * high = [[ChartHighlight alloc]initWithX:(double)someInt dataSetIndex:0];
et a utilisé la méthode highlightValueWithHighlight avec mais ne met toujours pas en surbrillance. La méthode chartValueSelected: entry: highlight: Delegate est appelée, qui contient les valeurs correctes dans l'objet d'entrée mais l'objet de surbrillance a un NaN dans la valeur y.

Existe-t-il un moyen de créer un objet ChartHighlight * contenant également la valeur y? Je vois différentes méthodes d'initialisation pour la classe ChartHighlight mais toutes les autres ont besoin de positions de pixels absolues.

@ liuxuan30 Pouvez-vous indiquer quelle partie de la démonstration des graphiques met en évidence un graphique par programmation?

Sinon, existe-t-il un moyen d'afficher l'entrée actuellement sélectionnée dans un autre mécanisme en plus d'utiliser la mise en évidence?

Ceci est absolument essentiel pour TVOS car les graphiques ne prennent pas en charge l'environnement de mise au point et les interactions des utilisateurs sur le graphique doivent être gérées par programme au lieu de s'appuyer sur les outils de reconnaissance de gestes intégrés.

Pour contourner ce problème, j'ai effectué les opérations suivantes dans ma copie locale:

Dans Highlight.swift, ajoutez un initialiseur qui prend également une valeur ay:

    /// - parameter x: the x-value of the highlighted value
    /// - parameter y: the y-value of the highlighted value
    /// - parameter dataSetIndex: the index of the DataSet the highlighted value belongs to
    public init(x: Double, y: Double, dataSetIndex: Int)
    {
        _x = x
        _y = y
        _dataSetIndex = dataSetIndex
    }

Ensuite, lorsque je veux mettre en évidence par programme, je le fais comme ceci:

   let entry = //... the ChartDataEntry I want to highlight
   self.chart.highlightValue(
       Highlight(x: entry.x, y: entry.y, dataSetIndex: 0)
   )

Je ne suis certainement pas assez familier avec le code pour savoir si c'est une approche décente pour aller de l'avant ou non. Si c'est le cas, je pense qu'une chose qui aiderait est qu'un ChartData.highlightForEntry() -> Highlight agit comme un inverse de ChartData.entryForHighlight()

En fait, en regardant de plus près, j'ai trouvé qu'il y avait des correctifs récents à certains des autres moteurs de rendu qui n'étaient pas appliqués aux graphiques en courbes.

Dans ce commit:

https://github.com/danielgindi/Charts/commit/8905a46c8262998ccdb780bbd5d2c03e45b8ab5a#diff -52d760df99fc778bb8222bd3cc9ce413R225

Les variables x et y ont été modifiées pour provenir de entry , pas de Highlight h . Je pense que si ce même correctif était appliqué à LineChartRenderer le problème serait résolu.

Je vais essayer cela et j'espère obtenir un PR pour qu'il soit prêt aujourd'hui si le temps le permet.

De plus, il ne semble pas que la valeur y soit réellement utilisée, car la ligne de surbrillance va simplement de contentTop à contentBottom. La racine du problème est en fait que dans cette ligne:

let pt = trans.pixelForValues(x: x, y: y)

Si y vaut NaN alors pt.x sort également comme NaN . Cela semble en fait être un bogue Swift 3 / CoreGraphics, comme en témoigne le Swift Repl ici:

  7> import CoreGraphics
  8> let trans = CGAffineTransform(scaleX: 1.0, y: 1.0)
trans: CGAffineTransform = {
  a = 1
  b = 0
  c = 0
  d = 1
  tx = 0
  ty = 0
}
  9> let pt = CGPoint(x: 1.0, y: Double.nan)
pt: CGPoint = (x = 1, y = NaN)
 10> pt.applying(trans)
$R2: CGPoint = (x = NaN, y = NaN)

@apurva pouvez-vous essayer ma branche fix-1495 ici:

https://github.com/ryanschneider/Charts/tree/fix-1495

Et voyez si cela fonctionne comme prévu pour vous? Ça marche pour moi. @danielgindi & @ liuxuan30 , j'ai plus ou moins copié le code de ScatterChartRenderer mais j'ai ajouté le if x > chartXMax * animator.phaseX chèque que LineChartRenderer avait.

Je ne pense pas que j'ai besoin d'itérer sur set.entriesForXValue(high.x) mais je le suis actuellement. Je ne pense pas qu'il y ait de mal car il ne devrait jamais y avoir plus d'une entrée, mais si vous pouvez confirmer que c'est le cas, je réduirai volontiers cela en un seul appel set.entryForXValue(high.x) et enverrai un PR.

Ce serait également bien d'ajouter une option de mise en évidence programmatique à ChartsDemo pour faciliter les tests de régression sur les bogues de mise en évidence, mais je n'ai pas étudié ce qu'il faudrait pour le faire.

Merci pour vos efforts @ryanschneider ! @danielgindi ce que tu en penses?

@ryanschneider Merci pour vos efforts. J'ai essayé les changements dans votre branche, mais les deux méthodes highlightValueWithX et highlightValueWithHighlight ne fonctionnent toujours pas pour moi. La valeur y de la surbrillance est toujours NaN et la surbrillance ne dessine pas sur le graphique lorsqu'elle est appelée par programme.

@danielgindi Juste testé avec le dernier maître, y compris votre commit à https://github.com/danielgindi/Charts/commit/32a5952cae25f864c5fd3a449e4f413da7f36f9b

highlightValueWithX n'affiche toujours pas les lignes de surbrillance. Le délégué est déclenché et la valeur y de la mise en évidence est toujours NaN dans le délégué. Comme précédemment, la mise en surbrillance via les outils de reconnaissance de gestes affiche les lignes de surbrillance, mais ce n'est pas le cas lors de l'appel de highlightValueWithX.

Cela ne fonctionne toujours pas.

Ne fonctionne toujours pas pour moi dans Swift 3.

`classe ChartsViewController: UIViewController {

<strong i="7">@IBOutlet</strong> var lineChartView: LineChartView!

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.

    let months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun"]
    let unitsSold = [20.0, 4.0, 6.0, 3.0, 12.0, 16.0]

    setChart(dataPoints: months, values: unitsSold)

}

func setChart(dataPoints: [String], values: [Double]) {

    var dataEntries: [ChartDataEntry] = []

    for i in 0..<dataPoints.count {
        let dataEntry = ChartDataEntry(x: Double(i), y: values[i])
        dataEntries.append(dataEntry)
    }

    let lineChartDataSet = LineChartDataSet(values: dataEntries, label: "Units Sold")
    let lineChartData = LineChartData(dataSet: lineChartDataSet)
    lineChartDataSet.highlightLineWidth = 2
    lineChartDataSet.highlightColor = UIColor.red

    lineChartView.data = lineChartData

    lineChartView.highlightValue(x: 3, dataSetIndex: 0)

    }

} `

Modifiez cette ligne: lineChartView.highlightValue (x: 3, dataSetIndex: 0)

à: lineChartView.highlightValue (Highlight (x: 3, y: 0, dataSetIndex: 0)

J'ai essayé de spécifier ay: 0 sur un graphique linéaire avec plusieurs ensembles de données et cela ne fonctionne toujours pas. Y a-t-il une mise à jour à ce sujet? C'est un assez gros bug.

J'appelle de l'Objectif C.

Petit hack pour obtenir la position de la valeur en surbrillance

// Highlight set programmatically
let dataEntry = dataEntries[linechartData.entryCount-1]
self.lineChartView.highlightValue(Highlight(x:` dataEntry.x, y:dataEntry.y, dataSetIndex: 0), callDelegate:` true)
func chartValueSelected(_ chartView: ChartViewBase, entry: ChartDataEntry, highlight: Highlight) {
        var markerPosition = CGPoint(x:highlight.xPx, y: highlight.yPx)
        // Hack to get the real position of the highlight programaticaly
        if markerPosition.x.isNaN || markerPosition.y.isNaN{
            let transformer = lineChartView.getTransformer(forAxis: lineChartView.leftAxis.axisDependency)
            let pt = transformer.pixelForValues(x: entry.x, y: entry.y)
            markerPosition.x = pt.x
            markerPosition.y = pt.y
        }
}

J'ai essayé votre hack, jndefosse, mais comment puis-je appeler la fonction pour afficher les étiquettes uniquement lorsque l'entrée est en surbrillance?

Ce bogue est-il corrigé? Je n'arrive pas à mettre en évidence une section dans les diagrammes à secteurs d'iOS 13.5 Swift 5.1

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

Questions connexes

Aungbandlab picture Aungbandlab  ·  4Commentaires

ahmedsafadii picture ahmedsafadii  ·  3Commentaires

BrandonShega picture BrandonShega  ·  4Commentaires

Bharati555 picture Bharati555  ·  4Commentaires

valeIT picture valeIT  ·  3Commentaires