Как добавить одну точку на линейный график в iOS-графиках

У меня есть линейный график, и я хочу добавить одну точку (разбросанную точку). Это возможно? Есть ли обходной путь? Я пытался понять это, мне это кажется невозможным, так как даже используя только данные разброса, я должен использовать один и тот же массив xVals, и в моем случае линия имеет несколько точек xVals, а единственная точка разброса только одно значение на X и одно на Y .

Спасибо

РЕДАКТИРОВАТЬ: Это то, чего я хочу добиться: введите здесь описание изображения

Для меня единственным решением с использованием iOS-диаграмм является наложение двух диаграмм просмотра...


person Nicholas    schedule 08.08.2015    source источник


Ответы (1)


Вы просите обрезать линейную диаграмму? Я не понимаю, в чем ваш вопрос. Если вам нужна только точечная диаграмма + линейная диаграмма, используйте 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
comment
Я думаю, что в сочетании это мой случай. Единственная проблема заключается в том, что линейная диаграмма не имеет тех же значений x, что и точечная. - person Nicholas; 11.08.2015
comment
что ты имеешь ввиду? вам нужно только добавить значения X в комбинированные данные диаграммы. взгляните на демо - person Wingzero; 11.08.2015
comment
Если вы посмотрите на демонстрацию, точки линейного графика имеют те же значения x, что и гистограммы... у вас есть пример, который делает иначе? - person Nicholas; 11.08.2015
comment
Я все еще не понимаю вашего вопроса. Если вы используете комбинированное представление диаграммы, вам нужно только установить xValues ​​​​в CombinedChartData и использовать те же xValues, что и xIndex для ваших LineChartDataSet и ScatterChartDataSet, но вам не нужно устанавливать xValues ​​​​для LineChartData и ScatterChartData. - person Wingzero; 11.08.2015
comment
в этом-то и дело! Я должен использовать те же значения xvalue! Я не хочу этого делать! Посмотрите на редактирование - person Nicholas; 11.08.2015
comment
Попался. К сожалению, текущая схема использует xIndex для построения графика, поэтому у вас нет шанса. Вы спрашиваете, я уже давно зарегистрировал проблему:github.com/danielgindi/ios-charts /issues/176 и github.com/danielgindi/ios-charts/issues /194. Суть в том, что мы должны рисовать ось x так же, как ось y. Со своей стороны, если вы знакомы с CoreGraphics и деталями ios-charts, вы можете заменить средство визуализации xAxis чем-то вроде HorizontalBarChartYAxisRenderer, а затем продолжить настройку. - person Wingzero; 11.08.2015
comment
Тем не менее, вы должны быть хорошо знакомы с ios-charts и преобразователями, чтобы настроить рендерер xAxis. Если нет, возможно, вам будет проще создать два представления и соединить их вместе. - person Wingzero; 11.08.2015
comment
только что решил с помощью наложения. Я скоро опубликую решение на всякий случай. - person Nicholas; 11.08.2015
comment
Вы можете отправить мне свое решение? даже наложения недостаточно, потому что xAxis не работает как yAxis, я не понимаю, почему они сделали такой выбор! - person Nicholas; 11.08.2015
comment
это довольно сложно объяснить, я мог бы дать вам несколько примеров кода, но вы должны придумать свой собственный, потому что мои просто решают мои проблемы - person Wingzero; 11.08.2015
comment
Пожалуйста, пришлите мне, я постараюсь разобраться. Спасибо - person Nicholas; 11.08.2015
comment
см. отредактированный ответ. Если считаешь себя полезным, то должен мне пиво! :) - person Wingzero; 12.08.2015
comment
Спасибо за комментарий, но я предпочел изменить библиотеку, так как настоящее кажется немного ограниченным. Я перешел на этот github.com/i-schuetz/SwiftCharts, который является модульным и более полным для мои цели. Документация довольно слабая, но поддержка разработчика отличная. - person Nicholas; 15.08.2015