2015-08-08 1 views
0

J'ai un lineChart et je veux ajouter un seul point (point dispersé). Est-ce possible? Y a-t-il une solution de contournement? J'ai essayé de comprendre par moi semble impossible puisque même en utilisant des données de dispersion seulement je dois utiliser le même tableau xVals, et dans mon cas la ligne a quelques points xVals et le seul point dispersé seulement une valeur sur X et un sur Y.Comment ajouter un seul point à une ligneChart dans iOS-charts

Merci

EDIT: C'est ce que je veux atteindre: enter image description here

pour moi, la seule solution à l'aide des graphiques iOS-est de superposer deux tableaux d'affichage ...

Répondre

1

Demandez-vous de tronquer le graphique linéaire? Je ne sais pas quelle est votre question. Si vous voulez juste diagramme de dispersion + graphique linéaire, utilisez CombinedChartView.

J'avais une demande de fonctionnalité pour tronquer le graphique linéaire, donc nous pouvons avoir un 'point unique' dans le graphique linéaire, donc si vous ne voulez pas connecter les points. Vérifiez si c'est https://github.com/danielgindi/ios-charts/issues/280. Si c'est vrai, vous pouvez aider à commenter afin que l'auteur le sache. De votre côté, ce que vous pouvez essayer est de sous-classer le moteur de rendu de graphique linéaire et le protocole pour vous permettre d'ajouter des points simples. Pour moi, je veux tronquer la ligne si le point courant ne peut pas être connecté au suivant. telles que les valeurs y: 1-2-3 5 (un seul point) 7-8-9.

Vous devez fournir ce que vous voulez pour que je puisse mieux vous aider.

Pour votre demande en commentaire, je peux seulement fournir un peu de code pour commencer, mais vous devez comprendre ce que j'essaie de faire. Connaissance que vous devez posséder: CoreGraphics + CGAffineTransform (iOS), viewPortHandler, transformateur, axisRenderer (ios-charts).

Dans mon problème, je vais sous-classer ScatterChartView, donc je peux dessiner xAxis comme yAxis. L'idée est de désactiver xAxis, et laisser RightAxis être HorizontalBarChartYAxisRenderer agissant comme xAxis.

D'abord, la sous-classe ScatterChartView et passer outre initialize():

public override func initialize() { 
    super.initialize(); 
    doubleTapToZoomEnabled = false; 
    xAxis.enabled = false; 

    // to determine how much space left for the dots to be drawn 

    _leftYAxisRenderer = ChartYAxisRenderer(viewPortHandler: _viewPortHandler, yAxis: _leftAxis, transformer: _leftAxisTransformer); 

    // right axis will be the bottom axis above xAxis 
    _rightAxisTransformer = ChartTransformerHorizontalBarChart(viewPortHandler: _viewPortHandler); 
    _rightYAxisRenderer = MyChartYAxisRendererHorizontalBarChart(viewPortHandler: _viewPortHandler, yAxis: _rightAxis, transformer: _rightAxisTransformer); 

    renderer = MyScatterChartRenderer(delegate: self, animator: _animator, viewPortHandler: _viewPortHandler); 
} 

override prepareValuePxMatrix

internal override func prepareValuePxMatrix() 
{ 
    // replace the chartXMin and deltaX with rightAxis values to keep the CTM correct 
    _rightAxisTransformer.prepareMatrixValuePx(chartXMin: _rightAxis.axisMinimum, deltaX: CGFloat(_rightAxis.axisRange), deltaY: CGFloat(_leftAxis.axisRange), chartYMin: _leftAxis.axisMinimum); 
    _leftAxisTransformer.prepareMatrixValuePx(chartXMin: _rightAxis.axisMinimum, deltaX: CGFloat(_rightAxis.axisRange), deltaY: CGFloat(_leftAxis.axisRange), chartYMin: _leftAxis.axisMinimum); 
} 

Jusqu'à présent, vous avez créer les rightAxis agissant comme axeX, et générer sa matrice.

Maintenant, pour la partie de données, je vais créer deux ensembles de données, et les assigner à AxisDependencyLeft et AxisDependencyRight via dataSet.axisDependency, donc je peux savoir comment les rendre.

Dans le moteur de rendu de graphique, je vais lire les deux ensembles de données, un pour x et un pour y, et utiliser le transformateur pour obtenir la position à dessiner.

tels que:

var xDataSet = scatterData.getRight() 
    var yDataSet = scatterData.getLeft() 
    var dataSet = yDataSet as! ScatterChartDataSet 

    var trans = delegate!.scatterChartRenderer(self, transformerForAxis: dataSet.axisDependency) 

    var phaseX = _animator.phaseX 
    var phaseY = _animator.phaseY 

    var xEntries = (xDataSet as! ScatterChartDataSet).yVals 
    var entries = dataSet.yVals 
    // if count not equal, something goes off 
    if (xEntries.count != entries.count) 
    { 
     return 
    } 

    var shapeSize = dataSet.scatterShapeSize 
    var shapeHalf = shapeSize/2.0 

    var point = CGPoint() 

    var valueToPixelMatrix = trans.valueToPixelMatrix 

    var shape = dataSet.scatterShape 

    CGContextSaveGState(context) 

    for (var j = 0, count = Int(min(ceil(CGFloat(entries.count) * _animator.phaseX), CGFloat(entries.count))); j < count; j++) 
    { 
     var e = entries[j] 
     var xEntry = xEntries[j] 
     point.x = CGFloat(xEntry.value) 
     point.y = CGFloat(e.value) * phaseY 
     point = CGPointApplyAffineTransform(point, valueToPixelMatrix) 
     // now you have the point to render, such as: 
     if (shape == .Circle) 
     { 
      CGContextSetFillColorWithColor(context, dataSet.colorAt(j).CGColor) 
      var rect = CGRect() 
      rect.origin.x = point.x - shapeHalf 
      rect.origin.y = point.y - shapeHalf 
      rect.size.width = shapeSize 
      rect.size.height = shapeSize 
      CGContextFillEllipseInRect(context, rect) 
     } 
    } 

Je ne peux pas donner tout le code que j'ai. Vous devez comprendre ce que je fais, donc vous pouvez imaginer le vôtre.La seule magie est que vous avez une chance de définir comment vous voulez le rendre.

+0

Je pense que c'est mon cas. Le seul problème est que le graphique linéaire n'a pas les mêmes valeurs x que le nuage de points. – Nicholas

+0

que voulez-vous dire par là? il suffit d'ajouter des valeurs X dans les données de graphique combinées. jetez un oeil à la démo – Wingzero

+0

Si vous regardez la démo, les points du graphique linéaire ont les mêmes valeurs x des graphiques à barres ... avez-vous un exemple qui fait autrement? – Nicholas