如何使ios图表分组BarChart?

我正在使用ios图表库。

我想将我的逆变器值分组,以便每年都是一个组。 不幸的是,每年每月的价值数量可能会有所不同。

我的数据json看起来像这样:

{"monthlyData":[{"ERTRAG":"30.2989999055862","MONAT":"2","JAHR":"2016"},{"ERTRAG":"154.897000223398","MONAT":"1","JAHR":"2016"},{"ERTRAG":"141.996000155807","MONAT":"12","JAHR":"2015"},{"ERTRAG":"135.449000149965","MONAT":"11","JAHR":"2015"},{"ERTRAG":"319.437000751495","MONAT":"10","JAHR":"2015"},{"ERTRAG":"483.369997739792","MONAT":"9","JAHR":"2015"},{"ERTRAG":"698.112997770309","MONAT":"8","JAHR":"2015"},{"ERTRAG":"771.764000892639","MONAT":"7","JAHR":"2015"},{"ERTRAG":"736.611003398895","MONAT":"6","JAHR":"2015"},{"ERTRAG":"737.237999916077","MONAT":"5","JAHR":"2015"},{"ERTRAG":"720.181995391846","MONAT":"4","JAHR":"2015"},{"ERTRAG":"484.979001283646","MONAT":"3","JAHR":"2015"},{"ERTRAG":"249.974001646042","MONAT":"2","JAHR":"2015"},{"ERTRAG":"92.8830004036427","MONAT":"1","JAHR":"2015"},{"ERTRAG":"52.7970000207424","MONAT":"12","JAHR":"2014"},{"ERTRAG":"181.025999426842","MONAT":"11","JAHR":"2014"},{"ERTRAG":"332.789002537727","MONAT":"10","JAHR":"2014"},{"ERTRAG":"482.244999885559","MONAT":"9","JAHR":"2014"},{"ERTRAG":"602.811999320984","MONAT":"8","JAHR":"2014"},{"ERTRAG":"699.872003316879","MONAT":"7","JAHR":"2014"},{"ERTRAG":"828.212007522583","MONAT":"6","JAHR":"2014"},{"ERTRAG":"679.010004997253","MONAT":"5","JAHR":"2014"},{"ERTRAG":"635.115998744965","MONAT":"4","JAHR":"2014"},{"ERTRAG":"559.617002010345","MONAT":"3","JAHR":"2014"},{"ERTRAG":"265.135001063347","MONAT":"2","JAHR":"2014"},{"ERTRAG":"165.272998273373","MONAT":"1","JAHR":"2014"},{"ERTRAG":"134.578999936581","MONAT":"12","JAHR":"2013"},{"ERTRAG":"153.774000287056","MONAT":"11","JAHR":"2013"},{"ERTRAG":"321.733997344971","MONAT":"10","JAHR":"2013"},{"ERTRAG":"482.768000483513","MONAT":"9","JAHR":"2013"},{"ERTRAG":"692.864000797272","MONAT":"8","JAHR":"2013"},{"ERTRAG":"846.429007053375","MONAT":"7","JAHR":"2013"},{"ERTRAG":"709.758005619049","MONAT":"6","JAHR":"2013"},{"ERTRAG":"532.493996858597","MONAT":"5","JAHR":"2013"},{"ERTRAG":"462.539998054504","MONAT":"4","JAHR":"2013"},{"ERTRAG":"419.105004012585","MONAT":"3","JAHR":"2013"},{"ERTRAG":"143.189998820424","MONAT":"2","JAHR":"2013"},{"ERTRAG":"78.720000628382","MONAT":"1","JAHR":"2013"},{"ERTRAG":"90.1430006623268","MONAT":"12","JAHR":"2012"},{"ERTRAG":"155.483000457287","MONAT":"11","JAHR":"2012"},{"ERTRAG":"348.231998205185","MONAT":"10","JAHR":"2012"},{"ERTRAG":"598.037001848221","MONAT":"9","JAHR":"2012"},{"ERTRAG":"729.740003108978","MONAT":"8","JAHR":"2012"},{"ERTRAG":"676.923998832703","MONAT":"7","JAHR":"2012"},{"ERTRAG":"694.879002094269","MONAT":"6","JAHR":"2012"},{"ERTRAG":"811.281997680664","MONAT":"5","JAHR":"2012"},{"ERTRAG":"489.765002369881","MONAT":"4","JAHR":"2012"},{"ERTRAG":"538.866001605988","MONAT":"3","JAHR":"2012"},{"ERTRAG":"277.856996208429","MONAT":"2","JAHR":"2012"},{"ERTRAG":"155.854999214411","MONAT":"1","JAHR":"2012"},{"ERTRAG":"148.157999750227","MONAT":"12","JAHR":"2011"},{"ERTRAG":"230.409998774529","MONAT":"11","JAHR":"2011"}]} 

我尝试了以下内容:

 var months = Array<String>() var years = Array<String>() var dataEntries: [BarChartDataEntry] = [] var dataSets: [BarChartDataSet] = [] var overallSum = 0.0 var year = 2010 //monthlyValues[0].year var count = 0 var chartDataSet: BarChartDataSet? for i in 0..<monthlyValues.count { // if year is different, create new barchartdataset if monthlyValues[i].year != year { years.append("\(monthlyValues[i].year)") chartDataSet = BarChartDataSet(yVals: dataEntries, label: "\(year)") chartDataSet!.colors = [UIColor.whiteColor()] dataSets.append(chartDataSet!) year = monthlyValues[i].year dataEntries = [] //months = [] count = 0 } months.append("\(monthlyValues[i].month)") overallSum += monthlyValues[i].amount let dataEntry = BarChartDataEntry(value: monthlyValues[i].amount, xIndex: count) count++ dataEntries.append(dataEntry) } let chartData = BarChartData(xVals: months, dataSets: dataSets) self.barChartView.data = chartData 

这会在图例中产生五个具有正确年份标签的系列,但在图表中没有组分隔符,并且每年的条数也是4或5(预期= 12)。

谢谢你的提示!

你这里有什么问题 现在你每年都要创build一个新的DataSet

那是错的。

你需要做的是创build尽可能多的DataSets因为你希望每个组有一个DataSet代表每个组中的一个条。 (例如,数据集1表示组的每个第一个条,数据集2每个组的第二个条,…)

作为一个例子,设想一个这样的图表,每个组有4组3个小节。 每个组代表一年。

  • 上面显示的设置需要3个数据集(每组一个)
  • 同一组中的条目具有相同的x-索引(例如,在第一组中,全部具有x-索引0)
  • 它共有12个条目
  • 每个DataSet包含4个条目x索引,范围从0到3

在这里,您可以find上述场景的示例。

在这里输入图像说明

 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) } 

如果你已经注意到上面的代码在function图中。 有让

  groupSpace = 0.3 let barSpace = 0.05 let barWidth = 0.3 // (0.3 + 0.05) * 2 + 0.3 = 1.00 -> interval per "group" 

这将使方程(groupSpace * barSpace)* n + groupSpace = 1

你需要围绕这个方程玩n个酒吧

我已经尝试过Rajan Twanabashu解决scheme,但它几乎是一个好的。 也许它已经改变,我不知道。

在我从Chart中findBarDataChart文件中的groupWidth函数之后,这就是我所做的。

groupWidth函数声明

let groupSpace = 1 - n * (barWidth + barSpace)

希望它可以帮助