2015-07-09 3 views
8

Ho creato il semplice grafico a barre con la libreria su https://github.com/danielgindi/ios-charts ancora non riesco a capire come rendere questo un grafico a barre raggruppato. Ho aggiunto le unità vendute al grafico, ma non so come ottenere l'array UnitBought sul grafico per renderlo un grafico raggruppato. Per favore aiutatemi.Converti grafico a barre in un grafico a barre raggruppato con danielgindi/ios-charts e Swift

@IBOutlet weak var barChartView: BarChartView! 

override func viewDidLoad() { 
    super.viewDidLoad()  
    months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] 
    let unitsSold = [20.0, 4.0, 6.0, 3.0, 12.0, 16.0, 4.0, 18.0, 2.0, 4.0, 5.0, 12.8] 
    let unitsBought = [20.0, 4.0, 6.0, 3.0, 12.0, 16.0, 4.0, 18.0, 2.0, 4.0, 5.0, 12.8] 
    setChart(months, values: unitsSold) 
} 


//functions 
func setChart(dataPoints: [String], values: [Double]) { 
    barChartView.noDataText = "You need to provide data for the chart." 

    var dataEntries: [BarChartDataEntry] = [] 

    for i in 0..<dataPoints.count { 
     let dataEntry = BarChartDataEntry(value: values[i], xIndex: i) 
     dataEntries.append(dataEntry) 
    } 

    let chartDataSet = BarChartDataSet(yVals: dataEntries, label: "Units Sold") 
    let chartData = BarChartData(xVals: months, dataSet: chartDataSet) 
    barChartView.data = chartData 
    barChartView.backgroundColor = UIColor(red: 255/255, green: 255/255, blue: 255/255, alpha: 1) 
    barChartView.gridBackgroundColor = UIColor(red: 255/255, green: 255/255, blue: 255/255, alpha: 1) 

    barChartView.legend.enabled = false 

    barChartView.leftAxis.drawGridLinesEnabled = false 
    barChartView.leftAxis.drawAxisLineEnabled = true 

    barChartView.rightAxis.drawGridLinesEnabled = false 
    barChartView.rightAxis.drawAxisLineEnabled = false 
    barChartView.rightAxis.drawLabelsEnabled = false 


    barChartView.xAxis.drawGridLinesEnabled = false 
    barChartView.xAxis.drawLabelsEnabled = true 

} 
+0

Solo un consiglio rapido - si può anche provare SwiftCharts, https://github.com/i-schuetz/SwiftCharts, c'è un impilati e accatastati & raggruppati esempio – Ixx

risposta

7

In realtà non si è fatto nulla con unitsBought.

Per un grafico a barre che si possono fare due cose:

  1. Aggiungine un'altra DataSet con il tuo unitsBought
  2. Utilizzare l'altro di sovraccarico di BarCharDataEntry(values: [Double], xIndex: Int) o BarCharDataEntry(values: [Double], xIndex: Int, label: String) passare multipla valori per ogni linea, il che lo rende impilati .
+1

Grazie Daniel. Biblioteca di carte impressionante. –

+0

@MugunthanBalakrishnan siete i benvenuti :-) –

+0

@daniel: Posso fare in modo che i valori si impilino in questo modo, ma non individualmente colorati. Come posso farlo? – Yohst

3
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

sono sovrapposte con questo metodo. –

+0

ora valore dell'asse y che mostra in multipli di 3 cioè 0,3,6,9,12 quindi, come cambiare il valore della barra dell'asse y ??? –

3

enter image description here

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

ora valore dell'asse y che mostra in multipli di 3 vale 0,3,6,9,12 quindi, come cambiare il valore della barra dell'asse y ??? –