mKane
mKane

Reputation: 982

ios-charts xaxis labels not lining up

I have created a grouped bar chart with pretty simple values. I have 5 labels which I would like spread out along the xaxis and 3 bar groups to coincide with each xaxis label.

The graph right now shows 1 xaxis label and 1 bar. (they may be out of frame, it's hard to tell.) I need each case to sync up with the correct msArrayAxis label.

Here is the code:

 var msArrayXAxis = ["0-20", "20-50", "50-100", "100-200", "<200"]


 barchartView.isUserInteractionEnabled = false
    barchartView.noDataText = "You need to provide data for the chart."
    barchartView.legend.enabled = false
    barchartView.chartDescription?.text = ""

    barchartView.xAxis.labelPosition = XAxis.LabelPosition.bottom
    barchartView.xAxis.valueFormatter = IndexAxisValueFormatter(values: msArrayXAxis)

    barchartView.xAxis.axisMinimum = 0

    barchartView.xAxis.granularity = 2
    barchartView.xAxis.setLabelCount(5, force: true)

    barchartView.xAxis.spaceMin = 0.3
    //        barchartView.extraBottomOffset = 1
    barchartView.xAxis.labelWidth = 1
    barchartView.xAxis.avoidFirstLastClippingEnabled = true
    barchartView.rightAxis.drawGridLinesEnabled = false
    barchartView.rightAxis.drawAxisLineEnabled = false
    barchartView.rightAxis.drawLabelsEnabled = false

func parsedArrayCount(case1: Array<Double>,case2: Array<Double>,case3: Array<Double>,case4: Array<Double>, case5: Array<Double>) -> [BarChartDataEntry] {

    var dataEntries1: [BarChartDataEntry] = []

    NSLog("Parsing array count")

    let dataEntry = BarChartDataEntry(x: Double(0), y:Double(case1.count))
    dataEntries1.append(dataEntry)

    let dataEntry2 = BarChartDataEntry(x: Double(1), y:Double(case2.count))
    dataEntries1.append(dataEntry2)

    let dataEntry3 = BarChartDataEntry(x: Double(2), y:Double(case3.count))
    dataEntries1.append(dataEntry3)

    let dataEntry4 = BarChartDataEntry(x: Double(3), y:Double(case4.count))
    dataEntries1.append(dataEntry4)

    let dataEntry5 = BarChartDataEntry(x: Double(1), y:Double(case5.count))
    dataEntries1.append(dataEntry5)

    return dataEntries1
}

func updateGraph(array: Array<name>?) {

    var dataEntries1: [BarChartDataEntry] = []
    var dataEntries2: [BarChartDataEntry] = []
    var dataEntries3: [BarChartDataEntry] = []

    barchartView.clear()
    rArray.removeAll()
    nameArray.removeAll()

    if array != nil && array!.count > 0 {

        for i in 0..<array!.count {
            rArray.append(array![i].r)
            nameArray.append(array![i].name)
        }

        NSLog("updating graph..")

        let name  = Analyzer.sharedInstance.nameArray(names: rArray.map{String($0)}, Name: nameArray)

        let cData = parserArrays(rArray: name.first.map {Double($0)!})
        let wData = parserArrays(rArray: name.last.map {Double($0)!})
        let vData = parserArrays(rArray: name.middle.map {Double($0)!})

        dataEntries1 = parsedArrayCount(case1: cData.case1, case2: cData.case2, case3: cData.case3, case4: cData.case4, case5: cData.case5)
        dataEntries2 = parsedArrayCount(case1: wData.case1, case2: wData.case2, case3: wData.case3, case4: wData.case4, case5: wData.case5)
        dataEntries3 = parsedArrayCount(case1: vData.case1, case2: vData.case2, case3: vData.case3, case4: vData.case4, case5: vData.case5)

        let chartDataSet = BarChartDataSet(values: dataEntries1, label: "")
        chartDataSet.colors = [UIColor.Blue()]

        let chartDataSet1 = BarChartDataSet(values: dataEntries2, label: "")
        chartDataSet1.colors = [UIColor.Green()]

        let chartDataSet2 = BarChartDataSet(values: dataEntries3, label: "")
        chartDataSet2.colors = [UIColor.Orange()]

        NSLog("Data set1 \(dataEntries1)")

        let groupSpace = 1.0
        let barSpace = 0.05
        let barWidth = 0.1

      /*  let xAxis = XAxis()
        xAxis.valueFormatter = self
        xAxis.drawGridLinesEnabled = true
        xAxis.labelPosition = .bottom
        xAxis.centerAxisLabelsEnabled = true
        barchartView.xAxis.valueFormatter = xAxis.valueFormatter*/

        let dataSets: [BarChartDataSet] = [chartDataSet,chartDataSet1]
        let chartData = BarChartData(dataSets: dataSets)
        chartData.setDrawValues(false)
        chartData.barWidth = barWidth
        chartData.groupBars(fromX:0.3, groupSpace: groupSpace, barSpace: barSpace)
       // let gg = chartData.groupWidth(groupSpace: groupSpace, barSpace: barSpace)
       // barchartView.xAxis.axisMaximum = Double(0) + gg * Double(msArrayXAxis.count)

        barchartView.data = chartData
        barchartView.animate(yAxisDuration: 0.5)
    }
}

Upvotes: 0

Views: 1731

Answers (1)

Vini App
Vini App

Reputation: 7485

Please check :

var msArrayXAxis = ["0-20", "20-50", "50-100", "100-200", "<200"]
barChartView.isUserInteractionEnabled = false
barChartView.noDataText = "You need to provide data for the chart."
barChartView.legend.enabled = false
barChartView.chartDescription?.text = ""

barChartView.xAxis.labelPosition = XAxis.LabelPosition.bottom
barChartView.xAxis.valueFormatter = IndexAxisValueFormatter(values: msArrayXAxis)

barChartView.xAxis.axisMinimum = 0
barChartView.xAxis.granularity = 1
barChartView.xAxis.labelCount = msArrayXAxis.count
barChartView.xAxis.centerAxisLabelsEnabled = true

barChartView.xAxis.spaceMin = 0.3
barChartView.xAxis.labelWidth = 1
barChartView.rightAxis.drawGridLinesEnabled = false
barChartView.rightAxis.drawAxisLineEnabled = false
barChartView.rightAxis.drawLabelsEnabled = false

func parsedArrayCount(case1: Array<Double>,case2: Array<Double>,case3: Array<Double>,case4: Array<Double>, case5: Array<Double>) -> [BarChartDataEntry] {
    var dataEntries1: [BarChartDataEntry] = []

    NSLog("Parsing array count")

    let dataEntry = BarChartDataEntry(x: Double(0), y:Double(case1.count))
    dataEntries1.append(dataEntry)

    let dataEntry2 = BarChartDataEntry(x: Double(1), y:Double(case2.count))
    dataEntries1.append(dataEntry2)

    let dataEntry3 = BarChartDataEntry(x: Double(2), y:Double(case3.count))
    dataEntries1.append(dataEntry3)

    let dataEntry4 = BarChartDataEntry(x: Double(3), y:Double(case4.count))
    dataEntries1.append(dataEntry4)

    let dataEntry5 = BarChartDataEntry(x: Double(1), y:Double(case5.count))
    dataEntries1.append(dataEntry5)

    return dataEntries1
}

func updateGraph() {
    var dataEntries1: [BarChartDataEntry] = []
    var dataEntries2: [BarChartDataEntry] = []
    var dataEntries3: [BarChartDataEntry] = []

    barChartView.clear()
    NSLog("updating graph..")

    let name  = Analyzer.sharedInstance.nameArray(names: rArray.map{String($0)}, Name: nameArray)

    let cData = parserArrays(rArray: name.first.map {Double($0)!})
    let wData = parserArrays(rArray: name.last.map {Double($0)!})
    let vData = parserArrays(rArray: name.middle.map {Double($0)!})

    dataEntries1 = parsedArrayCount(case1: cData.case1, case2: cData.case2, case3: cData.case3, case4: cData.case4, case5: cData.case5)
    dataEntries2 = parsedArrayCount(case1: wData.case1, case2: wData.case2, case3: wData.case3, case4: wData.case4, case5: wData.case5)
    dataEntries3 = parsedArrayCount(case1: vData.case1, case2: vData.case2, case3: vData.case3, case4: vData.case4, case5: vData.case5)

    let chartDataSet = BarChartDataSet(values: dataEntries1, label: "")
    chartDataSet.colors = [UIColor.blue]

    let chartDataSet1 = BarChartDataSet(values: dataEntries2, label: "")
    chartDataSet1.colors = [UIColor.green]

    let chartDataSet2 = BarChartDataSet(values: dataEntries3, label: "")
    chartDataSet2.colors = [UIColor.orange]

    NSLog("Data set1 \(dataEntries1)")

    let groupSpace = 0.1
    let barSpace = 0.05
    let barWidth = 0.25

    let dataSets: [BarChartDataSet] = [chartDataSet,chartDataSet1, chartDataSet2]
    let chartData = BarChartData(dataSets: dataSets)
    chartData.setDrawValues(false)
    chartData.barWidth = barWidth

    let gg = chartData.groupWidth(groupSpace: groupSpace, barSpace: barSpace)
    barChartView.xAxis.axisMaximum = Double(0) + gg * Double(msArrayXAxis.count)
    chartData.groupBars(fromX:0.0, groupSpace: groupSpace, barSpace: barSpace)
    barChartView.notifyDataSetChanged()
    barChartView.data = chartData
    barChartView.animate(yAxisDuration: 0.5)
}

Upvotes: 1

Related Questions