Ich möchte mehrere/gruppierte Balkendiagramme dynamisch erstellen. In meinem Fall stammen die Daten vom Server, daher ist die Anzahl der Balken nicht festgelegt. Um den Gruppenraum zu berechnen, habe ich diese Funktion erstellt
func calcGroupSpace(n:Int)->Double{
let y = 0.03 * Double(n)
let x : Double = 1 / (y+1)
return x
}
Meine xValues sind, die auch vom Server stammen, hier habe ich ein Array zum besseren Verständnis.
let xVal = ["Apples", "Oranges", "Pears", "Grapes", "Bananas"]
Ich habe eine Wertformatiererklasse erstellt.
`Klasse BarChartFormatter: NSObject, IAxisValueFormatter {
var labels: [String] = []
func stringForValue(_ value: Double, axis: AxisBase?) -> String {
let index = Int(value) % labels.count
if index>=0 && index<labels.count{
return labels[index]
}
return ""
}
init(labels: [String]) {
super.init()
self.labels = labels
}
}
`
Und in meinem Diagramm ist hier Code für die x-Achse und den Gruppenraum
` let chartFormatter = BarChartFormatter(labels: xAxis)
let xaxis = barChart.xAxis
//xaxis.valueFormatter = axisFormatDelegate
xaxis.drawGridLinesEnabled = true
xaxis.labelPosition = .bottom
xaxis.centerAxisLabelsEnabled = true
xaxis.valueFormatter = chartFormatter
xaxis.granularityEnabled = true
xaxis.granularity = 1
xaxis.labelCount = xAxis.count
let groupSpace = chartCommanStyle.calcGroupSpace(n: keys.count)
let barSpace = 0.03
let barWidth = groupSpace
let groupCount = xAxis.count+1
let startYear = 0
data.barWidth = barWidth;
barChart.xAxis.axisMinimum = Double(startYear)
let gg = data.groupWidth(groupSpace: groupSpace, barSpace: barSpace)
barChart.xAxis.axisMaximum = Double(startYear) + gg * Double(groupCount)
data.groupBars(fromX: Double(startYear), groupSpace: groupSpace, barSpace: barSpace)
barChart.data = data
barChart.setVisibleXRangeMaximum(15)
barChart.animate(yAxisDuration: 1.0, easingOption: .easeInOutBounce)`
Das Problem ist, dass meine X-Achsen-Beschriftungen in falscher Reihenfolge angezeigt werden. Es sollte wie angegeben sein, aber es druckt ungefähr so
Bitte helfen Sie mir, das zu lösen.
Ich habe dies gelöst, indem ich die Gruppenraum-Zählfunktion geändert habe. Früher habe ich es gezählt als
(groupSpace * barSpace) * n + groupSpace = 1
Aber das war falsch, ich habe es geändert in
(Balkenbreite * barSpace) * n + groupSpace = 1
also meine neue Funktion für n Spalten ist
func calcGroupSpace(n:Int)->Double{
let groupSpace = 1 - (0.23 * Double(n))
return groupSpace
}
Hoffe das kann anderen helfen..
Meine Frage bezieht sich nur auf die obige.
(Die obige Antwort ist für mich nicht hilfreich, deshalb poste ich mein eigenes Problem.)
Mein Code ist:
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]
//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 yaxis = barChartView.leftAxis
yaxis.spaceTop = 0.35
yaxis.axisMinimum = 0
yaxis.drawGridLinesEnabled = false
barChartView.rightAxis.enabled = true
barChartView.delegate = self
barChartView.noDataText = "You need to provide data for the chart."
barChartView.chartDescription?.textColor = UIColor.clear
let xaxis = barChartView.xAxis
//xaxis.valueFormatter = axisFormatDelegate
xaxis.forceLabelsEnabled = true
xaxis.drawGridLinesEnabled = false
xaxis.labelPosition = .bottom
xaxis.centerAxisLabelsEnabled = true
xaxis.valueFormatter = IndexAxisValueFormatter(values:self.months)
xaxis.granularityEnabled = true
xaxis.granularity = 1
var dataEntries: [BarChartDataEntry] = []
var dataEntries1: [BarChartDataEntry] = []
for i in 0..<self.months.count {
let dataEntry = BarChartDataEntry(x: Double(i) , y: Double(self.unitsSold[i]))
dataEntries.append(dataEntry)
let dataEntry1 = BarChartDataEntry(x: Double(i) , y: Double(self.unitsBought[i]))
dataEntries1.append(dataEntry1)
}
let chartDataSet = BarChartDataSet(values: dataEntries, label: "unitsSold")
let chartDataSet1 = BarChartDataSet(values: dataEntries1, label: "unitsBought")
let dataSets: [BarChartDataSet] = [chartDataSet,chartDataSet1]
chartDataSet.colors = [UIColor(red: 0/255, green: 255/255, blue: 0/255, alpha: 0.5)]
chartDataSet1.colors = [UIColor(red: 255/255, green: 0/255, blue: 0/255, alpha: 0.8)]
//chartDataSet.colors = ChartColorTemplates.colorful()
//let chartData = BarChartData(dataSet: chartDataSet)
let chartData = BarChartData(dataSets: dataSets)
let groupSpace = 0.5
let barSpace = 0.03
let barWidth = groupSpace
let groupCount = self.months.count
let startYear = 0
chartData.barWidth = barWidth;
barChartView.xAxis.axisMinimum = Double(startYear)
let gg = chartData.groupWidth(groupSpace: groupSpace, barSpace: barSpace)
barChartView.xAxis.axisMaximum = Double(startYear) + gg * Double(groupCount)
chartData.groupBars(fromX: Double(startYear), groupSpace: groupSpace, barSpace: barSpace)
barChartView.data = chartData
barChartView.setVisibleXRangeMaximum(15)
barChartView.animate(yAxisDuration: 1.0, easingOption: .easeInOutBounce)
Überprüfen Sie diesen Screenshot:
@sagarsukode hast du eine Lösung für das Problem gefunden?
Ich hatte das gleiche Problem wie das obige, ich habe es behoben, indem ich die Monate in einem Array dupliziert habe, also denke ich, dass Sie in Ihrem Fall so etwas haben werden:
let xAxisLabels = ["Feb", "Feb", "Mär", "Mär", "Apr", "Apr"...]
Verwenden Sie im IndexAxisValueFormatter(values: your_array_here) das xAxisLabels-Array;
Für die labelCount-Eigenschaft müssen Sie jedoch die Anzahl der Gruppen angeben, daher würde ich aus dem obigen Bild 5 eingeben. Verwenden Sie nicht die xAxisLabels-Anzahl.
Ich hoffe, das hilft!
@atalayasa & @mazenhalawi : Hallo, ich habe dieses Problem gelöst, bitte überprüfen Sie diesen Link: https://github.com/sagarsukode/Charts
@sagarsukode Vielen Dank, dass Sie viel sagarsukode bestätigen. Dies hilft mir wirklich, das Problem mit dem xaxis-Label zu beheben.
Ich danke dir sehr.
@sagarsukode DANKE!
Vielen Dank!!!!
Hilfreichster Kommentar
@atalayasa & @mazenhalawi : Hallo, ich habe dieses Problem gelöst, bitte überprüfen Sie diesen Link: https://github.com/sagarsukode/Charts