Вы просите обрезать линейную диаграмму? Я не понимаю, в чем ваш вопрос. Если вам нужна только точечная диаграмма + линейная диаграмма, используйте CombinedChartView
.
У меня был запрос функции для усечения линейной диаграммы, чтобы у нас была «одна точка» на линейной диаграмме, поэтому, если вы не хотите соединять точки. Проверьте, является ли это https://github.com/danielgindi/ios-charts/issues/280. а>. Если это правда, вы могли бы помочь прокомментировать, чтобы автор знал об этом.
Со своей стороны, вы можете попробовать создать подкласс средства визуализации линейных диаграмм и протокола, чтобы вы могли добавлять отдельные точки. Для меня я хочу обрезать линию, если текущая точка не может быть соединена со следующей. например значения y: 1-2-3 5 (одна точка) 7-8-9.
Вы должны предоставить то, что хотите, чтобы я мог помочь вам лучше.
На ваш вопрос в комментарии я могу предоставить вам только несколько кодов, чтобы вы начали, но вы должны полностью понять, что я пытаюсь сделать.
Необходимые знания: CoreGraphics + CGAffineTransform (iOS), viewPortHandler, трансформер, axisRenderer (ios-charts).
В моей задаче я создам подкласс ScatterChartView, чтобы я мог рисовать xAxis, как yAxis. Идея состоит в том, чтобы отключить xAxis и позволить rightAxis быть HorizontalBarChartYAxisRenderer, действующим как xAxis.
Во-первых, создайте подкласс ScatterChartView и переопределите 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);
}
переопределить 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);
}
До сих пор вы создавали правую ось, действующую как ось x, и генерировали ее матрицу.
Теперь, что касается части данных, я создам два набора данных и назначу их AxisDependencyLeft и AxisDependencyRight через dataSet.axisDependency, чтобы знать, как их отображать.
В средстве визуализации диаграммы я прочитаю два набора данных, один для x и один для y, и использую преобразователь, чтобы получить позицию для рисования.
такие как:
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)
}
}
Я не могу предоставить весь код, который у меня есть. Вы должны понимать, что я делаю, чтобы вы могли представить свое. Единственное волшебство в том, что у вас есть возможность определить, как вы хотите это визуализировать.
person
Wingzero
schedule
10.08.2015