Графики iOS не отображают все значения xAxis - PullRequest
1 голос
/ 15 апреля 2019

Я пишу приложение для iOS в Swift 4.2 Я использую библиотеку Графики для отображения Горизонтальная гистограмма . Мне нужно установить его значения xAxis. Отображается только последнее значение.

Снимок экрана: enter image description here

Фрагмент кода:

@IBOutlet var chartView: HorizontalBarChartView!

override func viewDidLoad() {
        super.viewDidLoad()

        let xAxis = chartView.xAxis
        xAxis.labelPosition = .bottom
        xAxis.labelFont = .systemFont(ofSize: 10)
        xAxis.drawAxisLineEnabled = false
        xAxis.drawGridLinesEnabled = false
        xAxis.granularity = 1
        xAxis.enabled=true

    xAxis.setLabelCount(3, force: false) //Not working as per expectations
   xAxis.valueFormatter=IndexAxisValueFormatter(values: ["A","B","C"])  //Not working as per expectations




        self.setDataCount(3,values:[142000,122400,100110])
        chartView.animate(yAxisDuration: 2.5)
    }


    func setDataCount(_ count: Int, values:[Double]) {
        let barWidth = 2.0
        let spaceForBar = 4.0
        var n=0
        let yVals = (0..<count).map { (i) -> BarChartDataEntry in

            let val = values[n]
            n+=1

            return BarChartDataEntry(x: Double(i)*spaceForBar, y: val)

        }

        let set1 = BarChartDataSet(entries: yVals, label: "DataSet")
        set1.drawIconsEnabled = false

        let data = BarChartData(dataSet: set1)
        data.setValueFont(UIFont(name:"HelveticaNeue-Light", size:10)!)
        data.barWidth = barWidth

        chartView.data = data

        //let xAxis = chartView.xAxis
        //xAxis.setLabelCount(3, force: false)
        //xAxis.valueFormatter=IndexAxisValueFormatter(values: ["A","B","C"])
    }

Я пытался найти решения:

xAxis.valueFormatter=IndexAxisValueFormatter(values: ["A","B","C"]) 

но они не работают.

Ответы [ 2 ]

1 голос
/ 15 апреля 2019

Это происходит потому, что функциональность по умолчанию IndexAxisValueFormatter

Вы должны написать свой собственный IAxisValueFormatter, как это

final class CustomFormatter: IAxisValueFormatter {

    var labels: [String] = []

    func stringForValue(_ value: Double, axis: AxisBase?) -> String {

        let count = self.labels.count

        guard let axis = axis, count > 0 else {
            return ""
        }

        let factor = axis.axisMaximum / Double(count)

        let index = Int((value / factor).rounded())

        if index >= 0 && index < count {
            return self.labels[index]
        }

        return ""
    }
}

Затем использовать его как

 let customFormater = CustomFormater()
 customFormater.labels = ["A","B","C"]

 chartView.xAxis.valueFormatter = customFormater

Убедитесь, что размер / количество данных и меток одинаковы или они не дадут желаемых результатов.

0 голосов
/ 15 апреля 2019

Я обновил ваш код, пожалуйста, проверьте изменения.

Я надеюсь, что это работает для вас.

класс ViewController: UIViewController {

@IBOutlet var chartView: HorizontalBarChartView!

override func viewDidLoad() {
    super.viewDidLoad()

    let xAxis = chartView.xAxis
    xAxis.labelPosition = .bottom
    xAxis.labelFont = .systemFont(ofSize: 10)
    xAxis.drawAxisLineEnabled = false
    xAxis.drawGridLinesEnabled = false
    xAxis.granularity = 1
    xAxis.enabled=true

    xAxis.setLabelCount(3, force: false) //Not working as per expectations
    xAxis.valueFormatter = IndexAxisValueFormatter(values: ["A","B","C"])//AxisValueFormatter(values: ["A","B","C"])  //Not working as per expectations

    self.setDataCount(3,values:[142000,122400,100110])
    chartView.animate(yAxisDuration: 2.5)
}


func setDataCount(_ count: Int, values:[Double]) {

    let yVals = (0..<count).map { (i) -> BarChartDataEntry in

        let val = values[i]

        return BarChartDataEntry(x: Double(i), y: val)
    }

    let set1 = BarChartDataSet(values: yVals, label: "DataSet")
    set1.drawIconsEnabled = false

    let data = BarChartData(dataSet: set1)

    data.setValueFont(UIFont(name:"HelveticaNeue-Light", size:10)!)
    //data.barWidth = barWidth

    chartView.data = data

    //let xAxis = chartView.xAxis
    //xAxis.setLabelCount(3, force: false)
    //xAxis.valueFormatter=IndexAxisValueFormatter(values: ["A","B","C"])
}

}

...