我有一个lineChart,我想添加一个点(分散点)。
那可能吗?
有什么解决方法吗?
我试图弄清楚这似乎是不可能的,因为即使仅使用散点数据,我也必须使用相同的xVals数组,并且在我的情况下,该行具有一些xVals点,而单个散点仅在X上具有一个值还有一个在Y上

谢谢

编辑:
这是我要实现的目标:
ios - 如何在iOS图表中向折线图添加单个点-LMLPHP

对我而言,使用iOS图表的唯一解决方案是叠加两个视图图表。

最佳答案

您是否要截断折线图?我不清楚您的问题是什么。如果只需要散点图+折线图,请使用CombinedChartView

我有一个要求截断折线图的功能,因此我们可以在折线图中使用“单点”,因此,如果您不想连接点。检查是否为https://github.com/danielgindi/ios-charts/issues/280。如果为true,则可以帮助发表评论,以便作者知道。

在您方面,您可以尝试的是将折线图渲染器和协议子类化,以允许您添加单个点。对我来说,如果当前点不能连接到下一个点,我想截断该行。例如y值:1-2-3 5(单点)7-8-9。

您必须提供所需的信息,以便我更好地帮助您。

对于您提出的问题,我只能提供一些代码来帮助您入门,但是您必须完全理解我要做什么。

您必须具备的知识:CoreGraphics + CGAffineTransform(iOS),viewPortHandler,转换器,axisRenderer(ios图表)。

在我的问题中,我将继承ScatterChartView的子类,以便可以像yAxis一样绘制xAxis。这个想法是禁用xAxis,并让rightAxis成为充当xAxis的Horizo​​ntalBarChartYAxisRenderer。

首先,子类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);
}


到现在为止,您已经创建了用作xAxis的rightAxis并生成其矩阵。

现在,对于数据部分,我将创建两个数据集,并通过dataSet.axisDependency将它们分配给AxisDependencyLeft和AxisDependencyRight,这样我就知道如何渲染它们。

在图表渲染器中,我将读取两个数据集,一个用于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)
        }
    }


我无法提供所有的代码。您必须了解我在做什么,以便您可以想象自己的。唯一的魔力是您有机会定义渲染方式。

关于ios - 如何在iOS图表中向折线图添加单个点,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31894189/

10-14 20:50
查看更多