Convert bar chart to a grouped bar chart with danielgindi/ios-charts and Swift

后端 未结 3 1552
难免孤独
难免孤独 2020-12-29 13:20

i have created the simple bar chart with the library at https://github.com/danielgindi/ios-charts still can\'t figure out how to make this a grouped bar chart. I\'ve added t

相关标签:
3条回答
  • 2020-12-29 13:27
    func setChartBarGroupDataSet(dataPoints: [String], values: [Double], values2: [Double],sortIndex:Int) {
    
        var dataEntries: [BarChartDataEntry] = []
        var dataEntries2: [BarChartDataEntry] = []
    
    
        for i in 0..<dataPoints.count {
    
            let dataEntry = BarChartDataEntry(value: values[i], xIndex: i)
            dataEntries.append(dataEntry)
        }
    
    
        for i in 0..<dataPoints.count {
    
            let dataEntry = BarChartDataEntry(value: values2[i], xIndex: i)
            dataEntries2.append(dataEntry)
        }
    
    
        let chartDataSet = BarChartDataSet(yVals: dataEntries, label: " ")
        let chartDataSet2 = BarChartDataSet(yVals: dataEntries2, label: " ")
    
        chartDataSet2.colors =  [UIColor(red: 255/255, green: 70/255, blue: 108/255, alpha: 1)]
    
        chartDataSet.colors =  [UIColor(red: 49/255, green: 27/255, blue: 146/255, alpha: 1)]
    
    
        let dataSets: [BarChartDataSet] = [chartDataSet,chartDataSet2]
    
        let data = BarChartData(xVals: dataPoints, dataSets: dataSets)
    
        barChartView.data = data
    
        barChartView.descriptionText = ""
    
    
        barChartView.rightAxis.drawGridLinesEnabled = false
        barChartView.rightAxis.drawAxisLineEnabled = false
        barChartView.rightAxis.drawLabelsEnabled = false
    
    
        barChartView.animate(xAxisDuration: 2.0, yAxisDuration: 2.0, easingOption: .EaseInBounce)
    
    
    }
    
    0 讨论(0)
  • 2020-12-29 13:34

    let months = ["Jan", "Feb", "Mar", "Apr", "May"]
        let unitsSold = [20.0, 4.0, 6.0, 3.0, 12.0]
        let unitsBought = [10.0, 14.0, 60.0, 13.0, 2.0]
    
         override func viewDidLoad() {
                super.viewDidLoad()
                // Do any additional setup after loading the view, typically from a nib.
                barChartView.delegate = self
                barChartView.noDataText = "You need to provide data for the chart."
                barChartView.chartDescription?.text = "sales vs bought "
    
    
                //legend
                let legend = barChartView.legend
                legend.enabled = true
                legend.horizontalAlignment = .right
                legend.verticalAlignment = .top
                legend.orientation = .vertical
                legend.drawInside = true
                legend.yOffset = 10.0;
                legend.xOffset = 10.0;
                legend.yEntrySpace = 0.0;
    
    
                let xaxis = barChartView.xAxis
                xaxis.valueFormatter = axisFormatDelegate
                xaxis.drawGridLinesEnabled = true
                xaxis.labelPosition = .bottom
                xaxis.centerAxisLabelsEnabled = true
                xaxis.valueFormatter = IndexAxisValueFormatter(values:self.months)
                xaxis.granularity = 1
    
    
                let leftAxisFormatter = NumberFormatter()
                leftAxisFormatter.maximumFractionDigits = 1
    
                let yaxis = barChartView.leftAxis
                yaxis.spaceTop = 0.35
                yaxis.axisMinimum = 0
                yaxis.drawGridLinesEnabled = false
    
                barChartView.rightAxis.enabled = false
               //axisFormatDelegate = self
    
                setChart()
            }
    
     func setChart() {
            barChartView.noDataText = "You need to provide data for the chart."
            var dataEntries: [BarChartDataEntry] = []
            var dataEntries1: [BarChartDataEntry] = []
    
            for i in 0..<self.months.count {
    
                let dataEntry = BarChartDataEntry(x: Double(i) , y: self.unitsSold[i])
                dataEntries.append(dataEntry)
    
                let dataEntry1 = BarChartDataEntry(x: Double(i) , y: self.self.unitsBought[i])
                dataEntries1.append(dataEntry1)
    
                //stack barchart
                //let dataEntry = BarChartDataEntry(x: Double(i), yValues:  [self.unitsSold[i],self.unitsBought[i]], label: "groupChart")
    
    
    
            }
    
            let chartDataSet = BarChartDataSet(values: dataEntries, label: "Unit sold")
            let chartDataSet1 = BarChartDataSet(values: dataEntries1, label: "Unit Bought")
    
            let dataSets: [BarChartDataSet] = [chartDataSet,chartDataSet1]
            chartDataSet.colors = [UIColor(red: 230/255, green: 126/255, blue: 34/255, alpha: 1)]
            //chartDataSet.colors = ChartColorTemplates.colorful()
            //let chartData = BarChartData(dataSet: chartDataSet)
    
            let chartData = BarChartData(dataSets: dataSets)
    
    
            let groupSpace = 0.3
            let barSpace = 0.05
            let barWidth = 0.3
            // (0.3 + 0.05) * 2 + 0.3 = 1.00 -> interval per "group" 
    
            let groupCount = self.months.count
            let startYear = 0
    
    
            chartData.barWidth = barWidth;
            barChartView.xAxis.axisMinimum = Double(startYear)
            let gg = chartData.groupWidth(groupSpace: groupSpace, barSpace: barSpace)
            print("Groupspace: \(gg)")
            barChartView.xAxis.axisMaximum = Double(startYear) + gg * Double(groupCount)
    
            chartData.groupBars(fromX: Double(startYear), groupSpace: groupSpace, barSpace: barSpace)
            //chartData.groupWidth(groupSpace: groupSpace, barSpace: barSpace)
            barChartView.notifyDataSetChanged()
    
            barChartView.data = chartData
    
    
    
    
    
    
            //background color
            barChartView.backgroundColor = UIColor(red: 189/255, green: 195/255, blue: 199/255, alpha: 1)
    
            //chart animation
            barChartView.animate(xAxisDuration: 1.5, yAxisDuration: 1.5, easingOption: .linear)
    
    
        }
    
    0 讨论(0)
  • 2020-12-29 13:36

    You haven't actually done anything with unitsBought.

    For a bar chart you can do two things:

    1. Add another DataSet with your unitsBought
    2. Use the other overload of BarCharDataEntry(values: [Double], xIndex: Int) or BarCharDataEntry(values: [Double], xIndex: Int, label: String) to pass multiple values per entry, which makes it stacked.
    0 讨论(0)
提交回复
热议问题