2

I'm trying to recreate a stacked horizontal bar chart similar to this example: http://www.highcharts.com/demo/bar-stacked

My current chart is pretty close to the example, but I don't have the flexibility in the labeling / coloring that I would like to have.

import UIKit
import Charts

@objc(BarChartFormatter)
public class BarChartFormatter: NSObject, IAxisValueFormatter {
    var names = [String]()

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

    public func setValues(values: [String]) {
        self.names = values
    }
}

class graphController: UIViewController {
    @IBOutlet weak var barChartView: HorizontalBarChartView!

    func setChart(dataPoints: [String], values: [[Double]]) {
        let formatter = BarChartFormatter()
        formatter.setValues(values: dataPoints)
        let xaxis:XAxis = XAxis()

        barChartView.noDataText = "No data."
        var dataEntries: [BarChartDataEntry] = []

        for j in 0..<values.count {
            let dataEntry = BarChartDataEntry(x: Double(j), yValues: values[j], label: dataPoints[j])
            dataEntries.append(dataEntry)
        }

        let chartDataSet = BarChartDataSet(values: dataEntries, label: nil)
        chartDataSet.colors = [UIColor(red: 0.0, green: 0.5, blue: 1.0, alpha: 1.0), UIColor(red: 0.5, green: 0.5, blue: 1.0, alpha: 1.0), UIColor(red: 1.0, green: 0.5, blue: 1.0, alpha: 1.0)]
        chartDataSet.valueTextColor = UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.0)
        let chartData = BarChartData(dataSet: chartDataSet)

        xaxis.valueFormatter = formatter
        barChartView.xAxis.labelPosition = .bottom
        barChartView.xAxis.drawGridLinesEnabled = false
        barChartView.xAxis.valueFormatter = xaxis.valueFormatter
        barChartView.xAxis.granularityEnabled = true
        barChartView.xAxis.granularity = 1.0
        barChartView.xAxis.decimals = 0
        barChartView.chartDescription?.enabled = false
        barChartView.legend.enabled = true
        barChartView.rightAxis.enabled = false
        barChartView.data = chartData
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        barChartView.noDataText = "No activity data."
        barChartView.noDataTextColor = UIColor(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0)
        barChartView.xAxis.labelTextColor = UIColor(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0)
        barChartView.legend.textColor = UIColor(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0)
        barChartView.backgroundColor = UIColor(red: 0.1, green: 0.1, blue: 0.1, alpha: 1.0)
        barChartView.tintColor = UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.0)
        barChartView.gridBackgroundColor = UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.0)
        barChartView.borderColor = UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.0)
        barChartView.xAxis.gridColor = UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.0)
        barChartView.xAxis.axisLineColor = UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.0)
        barChartView.animate(xAxisDuration: 2.0, yAxisDuration: 2.0)
        barChartView.rightAxis.enabled = false
        barChartView.leftAxis.enabled = false

        let names = ["A", "B", "C"]
        let values = [[2.0,1.0,1.0], [1.0,2.0,1.0], [1.0,1.0,2.0]]

        setChart(dataPoints: names, values: values)
    }
}

enter image description here

How can I modify setChart() to specify the colors on a per-bar basis rather than at the data set level, and specify my legend on a per-color basis rather as a "Stack"?

0 Answers0