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.
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
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
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