How to set x-axis labels with ios charts

不问归期 提交于 2019-11-28 18:23:48

Proper Solution for X-Axis String labels in Swift 3+

let months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
    barChartView.xAxis.valueFormatter = IndexAxisValueFormatter(values:months)
    barChartView.xAxis.granularity = 1

Create a class like this:

    import Foundation
    import Charts

    @objc(BarChartFormatter)
    class ChartFormatter:NSObject,IAxisValueFormatter{

    var months: [String]! = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]

    func stringForValue(_ value: Double, axis: AxisBase?) -> String {
    return months[Int(value)]
    }

}

Set the x-Axis like this:

    let xAxis=XAxis()
    let chartFormmater=ChartFormatter()

    for i in index{
        chartFormmater.stringForValue(Double(i), axis: xAxis)
    }

    xAxis.valueFormatter=chartFormmater
    chartView.xAxis.valueFormatter=xAxis.valueFormatter

I propose to use more flexible and pretty solution. You should have a formatter class like this:

final class MonthNameFormater: NSObject, IAxisValueFormatter {
    func stringForValue( _ value: Double, axis _: AxisBase?) -> String {
        return Calendar.current.shortMonthSymbols[Int(value)]
    }
}

Set up this type to your barChartView:

barChartView.xAxis.valueFormatter = MonthNameFormater()
barChartView.xAxis.granularity = 1.0

As a result you will have: Jan, Feb, ..., Dec In addition if you want to change presentation kind you should change shortMonthSymbols with some other: monthSymbols, veryShortMonthSymbols, standaloneMonthSymbols

Swift 4.2

I'm having pretty good results using standard DateFormatter() I'm converting UNIX timestamp to format day.month

final class XAxisNameFormater: NSObject, IAxisValueFormatter {

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

        let formatter = DateFormatter()
        formatter.locale = Locale(identifier: "en_US_POSIX")
        formatter.dateFormat = "dd.MM"

        return formatter.string(from: Date(timeIntervalSince1970: value))
    }

}

Usage:

self.lineChartView.xAxis.valueFormatter = XAxisNameFormater()
self.lineChartView.xAxis.granularity = 1.0

You can do this by creating your own formatter for the time. Below I mention sample code for that for your reference.

    public class DateValueFormatter: NSObject, AxisValueFormatter {
    private let dateFormatter = DateFormatter()

    override init() {
        super.init()
        dateFormatter.dateFormat = "HH:mm:ss"
    }

    public func stringForValue(_ value: Double, axis: AxisBase?) -> String {
        return dateFormatter.string(from: Date(timeIntervalSince1970: value))
    }
}

To set your value just use below code.

self.yourChart.xAxis.valueFormatter = DateValueFormatter()
self.yourChart.xAxis.granularity = 1.0
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!