Charts: Problema de rótulo XAxis com gráfico de barras múltiplo / agrupado

Criado em 26 mai. 2017  ·  9Comentários  ·  Fonte: danielgindi/Charts

Quero criar um gráfico de barras múltiplo / agrupado dinamicamente. No meu caso, os dados vêm do servidor, portanto, o número de barras não é fixo. Para calcular o espaço do grupo, criei esta função

func calcGroupSpace(n:Int)->Double{ let y = 0.03 * Double(n) let x : Double = 1 / (y+1) return x }

Meus xValues ​​são, que também são do servidor, aqui tenho make array para melhor entendimento.

let xVal = ["Apples", "Oranges", "Pears", "Grapes", "Bananas"]

Eu criei uma classe de formatador de valor.

`class 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
}

}
`

E dentro do meu gráfico, aqui está o código para o eixo xe espaço de grupo
`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)`

O problema é que meus rótulos do eixo x são exibidos na ordem errada. Deve ser como fornecido, mas imprime algo assim

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

Por favor me ajude a resolver isso.

Comentários muito úteis

@atalayasa & @mazenhalawi : Olá, resolvi este problema, verifique este link: https://github.com/sagarsukode/Charts

Todos 9 comentários

Resolvi isso alterando a função de contagem do espaço do grupo. Anteriormente eu estava contando como

(groupSpace * barSpace) * n + groupSpace = 1

Mas isso estava errado, eu mudei para

(largura da barra * barSpace) * n + groupSpace = 1

então minha nova função para n número de colunas é

func calcGroupSpace(n:Int)->Double{ let groupSpace = 1 - (0.23 * Double(n)) return groupSpace }

Espero que isso possa ajudar outros ..

Minha pergunta está relacionada apenas a um acima.
(A resposta acima não é útil para mim, é por isso que estou postando meu próprio problema.)
Meu código é:

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)

Verifique esta foto de tela:

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

Problemas: Por que todos os rótulos dos eixos xis não estão aparecendo? Estou usando Swift 4 e Xcode 9.2

ATUALIZAÇÃO (08 de maio de 2018): Eu resolvi esse problema, verifique este link: https://github.com/sagarsukode/Charts

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

@sagarsukode encontrou alguma solução para o problema?

Tive o mesmo problema acima, resolvi-o duplicando os meses em uma matriz, então acho que no seu caso você terá algo como:
deixe xAxisLabels = ["fevereiro", "fevereiro", "março", "março", "abril", "abril" ...]

no IndexAxisValueFormatter (valores: your_array_here) use a matriz xAxisLabels;
entretanto, para a propriedade labelCount, você precisa mencionar o número de grupos, portanto, da imagem acima, eu colocaria 5. não use a contagem xAxisLabels.

espero que ajude!

@atalayasa & @mazenhalawi : Olá, resolvi este problema, verifique este link: https://github.com/sagarsukode/Charts

@sagarsukode Obrigado verificar muito sagarsukode. Isso realmente me ajuda a corrigir o problema da etiqueta do eixo xis.

Muito obrigado.

@sagarsukode OBRIGADO!

Obrigado!!!!

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

kwstasna picture kwstasna  ·  3Comentários

heumn picture heumn  ·  3Comentários

kirti0525 picture kirti0525  ·  3Comentários

PrashantKT picture PrashantKT  ·  3Comentários

Aungbandlab picture Aungbandlab  ·  4Comentários