Charts: Como recuperar os valores x para BarChart [problema de migração de gráficos 3]

Criado em 20 out. 2016  ·  22Comentários  ·  Fonte: danielgindi/Charts

Olá,

Estou tentando começar com os gráficos 3, mas tenho alguns problemas de migração.
Esse código de gráficos antigo criou um gráfico de barras com um histórico de perguntas respondidas certas e erradas e escrevendo o dia no topo da barra correspondente.

img_0771

Eu o construí com o seguinte código:

            let examHistoryChartFrame = CGRectMake(scrWidth*0.08, 24 + scrWidth*1.68 , scrWidth*0.84, scrWidth*0.84)
            let examHistoryView = BarChartView(frame: examHistoryChartFrame)

            examHistoryView.descriptionText = ""
            examHistoryView.userInteractionEnabled = false
            //  historyBarChartView.xAxis.valueFormatter = NSNumberFormatter()
            examHistoryView.rightAxis.enabled = false
            let formatter = NSNumberFormatter()
            formatter.minimumFractionDigits = 0
            examHistoryView.leftAxis.valueFormatter = formatter
            examHistoryView.drawHighlightArrowEnabled = true
            examHistoryView.drawValueAboveBarEnabled = false
            examHistoryView.xAxis.drawGridLinesEnabled = false

           //...getting the data in some way....

           var counter = 0
           let fi = getDataEntries(dataPoints, values: firstValues, counter: counter)
           counter += 1
           let sec = getDataEntries(dataPoints, values: secondValues, counter: counter)
           dataPoints = transformDataPoints(dataPoints)
           examHistoryView.data =  BarChartData(xVals: dataPoints, dataSets: [fi,sec])

A função getDataEntries (...) faz o seguinte:

    func getDataEntries(dataPoints: [String], values: [Double], counter: Int) -> BarChartDataSet{
        var dataEntries: [ChartDataEntry] = []
        for i in 0..<dataPoints.count {
            let dataEntry = BarChartDataEntry(value: values[i], xIndex: i)
            dataEntries.append(dataEntry)
        }
        let ret = BarChartDataSet(yVals: dataEntries)
        ret.drawValuesEnabled = false
        switch counter{
            case 0:
                ret.colors = [GREEN]
                ret.label = "Richtig beantwortet"
                break
            case 1:
                ret.colors = [RED]
                ret.label = "Falsch beantwortet"
                break
            default:
                break
        }
        return ret
    }

Depois da atualização, tentei de tudo para trazer as datas de volta ao gráfico, mas não consigo.

Alguém sabe qual atributo devo manipular para atingir meu objetivo?

Obrigado pela ajuda!
Patrick

Comentários muito úteis

Observe que nos Gráficos 3.0.1 há um IndexAxisValueFormatter que você pode passar uma matriz de rótulos e fazer com que se comportem como nos Gráficos 2.0

Todos 22 comentários

você descobriu isso?

Não entendi

Am 24.10.2016 um 23:22 schrieb Ace Green < [email protected] [email protected] >:

você descobriu isso?

Você está recebendo isso porque é o autor do tópico.
Responda a este e-mail diretamente, visualize-o em Gi tHubhttps: //github.com/danielgindi/Charts/issues/1688#issuecomment -255869865 ou silencie o th readhttps: //github.com/notifications/unsubscribe-auth/AK1gNdZILGok2Rgm0xOB0-85Wjsw iroks5q3SF0gaJpZM4KcIMy.

mesmo problema. não descobri ainda

@danielgindi Alguma ideia de como resolver esse problema?

Estou realmente interessado nisso, preciso de categorias (strings) no eixo x, não de duplas

Mesmo aqui! muito frustrante. Agradeço o trabalho que foi colocado nisso, mas estou pensando em usar outro projeto de gráficos por causa do problema do eixo x.

Não sei se você leu as notas de lançamento ou jogou com ChartsDemo, mas o eixo x não funciona mais como um baseado em índice. Não funciona como o eixo y.

Por exemplo, o gráfico de barras no ChartsDemo fez exatamente o que você precisa.
ChartsDemo tem tantas demonstrações para você consultar.

Se você quiser ter strings, apenas siga IChartAxisValueFormatter e escreva um formatador para formatá-los em strings.
Não se esqueça de definir xAxis.centerAxisLabelsEnabled = YES .

Se você quiser ter certeza de todos os rótulos do eixo x, defina labelCount = your x vals count

É uma grande mudança, de fato, mas acredito que o novo eixo x seja mais flexível de usar.

Aqui está o meu problema. Meu gráfico de barras tem barras agrupadas. Quero definir um x-string para cada grupo, mas não sei como. Formatador de eixos testado.

Minha solução foi um formatador customizado que herda de AxisFormatter. Em seguida, você pode definir os valores do eixo x para contar de 0 a z. Agora você entrega suas strings x como uma [String] e pode definir a direita por meio dos valores. Espero que isso ajude você.

@ patreu22 você pode adicionar algum código de exemplo para mostrar isso?

Esse é o meu código XAxisFormatter:

import Foundation
import Charts

public class XAxisFormatter: NSObject, IAxisValueFormatter {

    var dates: [String]
    /// Called when a value from an axis is formatted before being drawn.
    ///
    /// For performance reasons, avoid excessive calculations and memory allocations inside this method.
    ///
    /// - returns: The customized label that is drawn on the x-axis.
    /// - parameter value:           the value that is currently being drawn
    /// - parameter axis:            the axis that the value belongs to
    ///

   //swap the dates array with your x-axis-Strings
    init(dates: [String]){
        self.dates = dates
    }

    public func stringForValue(_ value: Double, axis: AxisBase?) -> String {
        let valStr = dates[Int(value)]

       //do Formatting
        return "\(day). \(newMonth)"

    }

E esse é o código como formatei o xAxis:

            let dateFormatter = XAxisFormatter(dates: dataPoints)
            historyBarChartView.xAxis.granularity = 1
            historyBarChartView.xAxis.labelCount = dataPoints.count
            historyBarChartView.xAxis.drawGridLinesEnabled = false
            historyBarChartView.drawValueAboveBarEnabled = true
            historyBarChartView.xAxis.valueFormatter = dateFormatter

Para essa solução, é importante que seus valores x iterem de 0 a z.
Eu sei, não é a solução mais bonita, mas pelo menos funciona muito bem.

Espero que ajude!

@ patreu22 sim, obrigado por isso. Consegui testar e fazer funcionar. Agora eu tenho que lidar com a formatação da fonte que parece. Como você lidou com rótulos sobrepostos?

Às vezes, mudar por mudar não é bom. Como criar subclasses de um formatador é mais fácil do que apenas passar um array diretamente como antes? Eu posso ver isso como uma opção de personalização para uso avançado, mas a forma mais antiga ainda deveria ter permanecido.

Para o problema da fonte, xAxis.labelFont ajuda você?

Não tenho problemas com a sobreposição de rótulos ... talvez "\ n" seja uma solução?
A propósito, sua IU parece muito sofisticada! :)

Sim, eu já tinha o labelFont .. Acho que funcionaria se aquele segundo rótulo "Buy" inesperado não estivesse lá.

Oh, esse é o meu aplicativo StockSwipe. Em que você está trabalhando?

Em um pequeno aplicativo de educação que também apresenta estatísticas de aprendizagem ... Espero que você consiga descobrir!

Vielen dank :) .. Acontece que duplicar é porque os valores não são iguais ao número de conjuntos de dados.

Editar:
Definir a granularidade faz com que ele seja incrementado em um. Coisas estranhas acontecendo aqui. Por que você precisaria definir isso se a contagem dos conjuntos de dados é conhecida e a contagem dos valores do formatador também é conhecida.

Parece que o Chart 3.0 foi projetado para personalização máxima e uso avançado, mas isso torna o uso básico não fácil.

chartView.xAxis.granularity = 1

@acegreen Tenho um problema semelhante, a primeira etiqueta está duplicada e não consigo descobrir o porquê. O que você quer dizer com "os valores não são iguais ao número de conjuntos de dados"?

@dbmrq com isso quero dizer que eu tinha, por exemplo, 4 pontos do conjunto de dados, mas os valores de x eram 5, ou assim pensei. Acontece que se você trouxer o valor em sua subclasse, ele será algo como 0 0 1 2 3 em vez de 0 1 2 3 4.

Não sei por que o primeiro rótulo está duplicado, mas se você leu minha edição, definir a granularidade = 1 resolveu o problema.

Observe que nos Gráficos 3.0.1 há um IndexAxisValueFormatter que você pode passar uma matriz de rótulos e fazer com que se comportem como nos Gráficos 2.0

@acegreen Ah, ok, agora entendi. Obrigado!

@danielgindi Oh, agora terei que remover todas aquelas IAxisValueFormatter classes que acabei de implementar, haha. Obrigado! :)

Oh não, essa dica teria economizado muito tempo para mim @danielgindi haha

Am 21.11.2016 um 19:08 schrieb Daniel Marques < [email protected] [email protected] >:

@aceg reenhttps: //github.com/acegreen Ah, ok, agora entendi. Obrigado!

@danielgindihttps : //github.com/danielgindi Oh, agora terei que remover todas as classes IAxisValueFormatter que acabei de implementar, haha. Obrigado! :)

-
Você está recebendo isso porque foi mencionado.
Responda a este e-mail diretamente, visualize-o em Gi tHubhttps: //github.com/danielgindi/Charts/issues/1688#issuecomment -262018947 ou desative o th

Vou adicionar este IndexAxisValueFormatter nas notas de versão 3.0.1.

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

Questões relacionadas

valeIT picture valeIT  ·  3Comentários

JW00332 picture JW00332  ·  4Comentários

kwstasna picture kwstasna  ·  3Comentários

cilasgimenez picture cilasgimenez  ·  4Comentários

BrandonShega picture BrandonShega  ·  4Comentários