Как я могу показать первое значение и последнее значение в линейном графике - PullRequest
0 голосов
/ 29 августа 2018

Я использую библиотеку диаграмм, и я пытаюсь добавить первое и последнее значение на график линейного графика. Пожалуйста, дайте мне знать, как мне этого добиться. Я попытался настроить метод drawValue в linechartrenderer, но не сработало.

Вот мой код

var months = ["Dec 15", "Jun 16", "Dec 16", "Jun 17", "Dec 17", "Jun 18"]
var unitsSold = [50.0, 25.0, 50.0, 75.0, 100.0, 75.0]

Viewdidload:

    setChart(dataPoints: months, values: unitsSold)

Метод:

  func setChart(dataPoints: [String], values: [Double]) {
    var dataEntries: [ChartDataEntry] = []

    for i in 0..<dataPoints.count {

        let dataEntry = ChartDataEntry(x: Double(i), y: values[i], data: dataPoints[i] as AnyObject)
        dataEntries.append(dataEntry)
    }

    let chartDataSet = LineChartDataSet(values: dataEntries, label: nil)
    chartDataSet.setColor(UIColor(red: 53/255, green: 85/255, blue: 123/255, alpha: 1))
    chartDataSet.circleRadius = 5
    chartDataSet.circleHoleRadius = 2
    chartDataSet.drawValuesEnabled = false
    chartDataSet.drawCirclesEnabled = false

    let chartData = LineChartData(dataSets: [chartDataSet])

    defaultChartView.data = chartData

    defaultChartView.xAxis.valueFormatter = IndexAxisValueFormatter(values: months)
    defaultChartView.xAxis.labelPosition = .bottom
    defaultChartView.xAxis.drawGridLinesEnabled = false
    //lineChartView.xAxis.avoidFirstLastClippingEnabled = true
    defaultChartView.xAxis.axisMinimum = 0
    defaultChartView.xAxis.granularity = 1

    defaultChartView.rightAxis.drawAxisLineEnabled = false
    defaultChartView.rightAxis.drawLabelsEnabled = false
    defaultChartView.rightAxis.enabled = false

    defaultChartView.leftAxis.drawAxisLineEnabled = false
    defaultChartView.leftAxis.axisMinimum = 0.0
    defaultChartView.leftAxis.drawLabelsEnabled = false

    //lineChartView.leftAxis.drawGridLinesEnabled = false
    //lineChartView.leftAxis.granularityEnabled = false


    defaultChartView.pinchZoomEnabled = true
    defaultChartView.doubleTapToZoomEnabled = true
    defaultChartView.legend.enabled = false
    defaultChartView.chartDescription?.text = " "



}

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Решение - перейти в файл linechartrenderer и заменить метод drawValues ​​

open override func drawValues(context: CGContext)
{
    guard
        let dataProvider = dataProvider,
        let lineData = dataProvider.lineData
        else { return }

    if isDrawingValuesAllowed(dataProvider: dataProvider)
    {
        var dataSets = lineData.dataSets

        let phaseY = animator.phaseY

        var pt = CGPoint()

        for i in 0 ..< dataSets.count
        {
            guard let dataSet = dataSets[i] as? ILineChartDataSet else { continue }


            if !shouldDrawValues(forDataSet: dataSet)
            {
                continue
            }

            let valueFont = dataSet.valueFont

            guard let formatter = dataSet.valueFormatter else { continue }

            let trans = dataProvider.getTransformer(forAxis: dataSet.axisDependency)
            let valueToPixelMatrix = trans.valueToPixelMatrix

            let iconsOffset = dataSet.iconsOffset

            // make sure the values do not interfear with the circles
            var valOffset = Int(dataSet.circleRadius * 1.75)

            if !dataSet.isDrawCirclesEnabled
            {
                valOffset = valOffset / 2
            }

            _xBounds.set(chart: dataProvider, dataSet: dataSet, animator: animator)

            for j in stride(from: _xBounds.min, through: min(_xBounds.min + _xBounds.range, _xBounds.max), by: 1)
            {
                guard let e = dataSet.entryForIndex(j) else { break }

                if(j == 0 || j == dataSet.entryCount - 1)
                {
                    pt.x = CGFloat(e.x)
                    pt.y = CGFloat(e.y * phaseY)
                    pt = pt.applying(valueToPixelMatrix)

                    if (!viewPortHandler.isInBoundsRight(pt.x))
                    {
                        break
                    }

                    if (!viewPortHandler.isInBoundsLeft(pt.x) || !viewPortHandler.isInBoundsY(pt.y))
                    {
                        continue
                    }

                    if dataSet.isDrawValuesEnabled {
                        ChartUtils.drawText(
                            context: context,
                            text: formatter.stringForValue(
                                e.y,
                                entry: e,
                                dataSetIndex: i,
                                viewPortHandler: viewPortHandler),
                            point: CGPoint(
                                x: pt.x,
                                y: pt.y - CGFloat(valOffset) - valueFont.lineHeight),
                            align: .center,
                            attributes: [NSAttributedStringKey.font: valueFont, NSAttributedStringKey.foregroundColor: dataSet.valueTextColorAt(j)])
                    }

                    if let icon = e.icon, dataSet.isDrawIconsEnabled
                    {
                        ChartUtils.drawImage(context: context,
                                             image: icon,
                                             x: pt.x + iconsOffset.x,
                                             y: pt.y + iconsOffset.y,
                                             size: icon.size)
                    }

                }
                else{



                }


            }
        }
    }
}
0 голосов
/ 29 августа 2018

viewDidLoad:

guard let firstMonth = months.first, let lastMonth = months.last else {
return
}

let myMonths = [firstMonth, lastMonth]
guard let firstValue = unitsSold.first, let lastValue = unitsSold.last else {
return
}
let myValues = [firstValue, lastValue]

setChart(dataPoints: myMonths, values: myValues)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...