Charts: XAxis-Beschriftungsproblem mit mehreren/gruppierten Balkendiagrammen

Erstellt am 26. Mai 2017  ·  9Kommentare  ·  Quelle: danielgindi/Charts

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 ​​​​

screen shot 2017-05-26 at 5 53 42 pm

Bitte helfen Sie mir, das zu lösen.

Hilfreichster Kommentar

@atalayasa & @mazenhalawi : Hallo, ich habe dieses Problem gelöst, bitte überprüfen Sie diesen Link: https://github.com/sagarsukode/Charts

Alle 9 Kommentare

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:

screen shot 2018-03-17 at 3 10 09 pm

Probleme: Warum werden nicht alle xaxis-Beschriftungen angezeigt? Ich verwende Swift 4 & Xcode 9.2

UPDATE (08. Mai - 2018): Ich habe dieses Problem gelöst, bitte überprüfen Sie diesen Link: https://github.com/sagarsukode/Charts

simulator screen shot - iphone x - 2018-05-08 at 16 32 30

@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!!!!

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

kwstasna picture kwstasna  ·  3Kommentare

valeIT picture valeIT  ·  3Kommentare

brytnvmg picture brytnvmg  ·  4Kommentare

Aungbandlab picture Aungbandlab  ·  4Kommentare

cilasgimenez picture cilasgimenez  ·  4Kommentare