Charts: Wie ändere ich die Werte der X-Achse Swift?

Erstellt am 20. Aug. 2016  ·  33Kommentare  ·  Quelle: danielgindi/Charts

Mit der neuen Version hatte ich einige Probleme, einige Grafiken zu erstellen, der vorherige Code war:

func setChart(dataPoints: [String], values: [Double]) {
var dataEntries: [BarChartDataEntry] = []

for i in 0..<dataPoints.count {
    let dataEntry = BarChartDataEntry(value: values[i], xIndex: i)
    dataEntries.append(dataEntry)
}

let chartDataSet = BarChartDataSet(yVals: dataEntries, label: "Units Sold")
let chartData = BarChartData(xVals: months, dataSet: chartDataSet)
barChartView.data = chartData
}

Sie können die Werte zum Beispiel ein Array von Monaten mit der Zeile übergeben:

let chartData = BarChartData(xVals: months, dataSet: chartDataSet)

Nach der neuen Version lautet der Code zum Implementieren des gleichen Diagramms:

func setChart(dataPoints: [String], values: [Double]) {

    var dataEntries: [BarChartDataEntry] = []

    for i in 0..<dataPoints.count {
        let dataEntry = BarChartDataEntry(x: Double(i+2), y:values[i], data: months )
        dataEntries.append(dataEntry)
    }

    let chartDataSet = BarChartDataSet(values: dataEntries, label: "Units Sold")

    let chartData = BarChartData()
    chartData.addDataSet(chartDataSet)
    barChartView.data = chartData

}

Ich habe ein paar Stunden versucht, aber ich konnte keine Möglichkeit finden, die Werte der X-Achse zu ändern. Ich hoffe, jemand kann mir helfen, danke !!

Hilfreichster Kommentar

Ich hatte ein ähnliches Problem. Die Dokumentation ist zu kurz, aber das Arbeiten mit der x-Achse erfordert einige Codezeilen. Mit dem von @ajimenezjulio bereitgestellten Code habe ich eine Klassenerweiterung erstellt, um die Verwendung von BarChartView zu vereinfachen. Vielleicht ist es für jemanden nützlich.

extension BarChartView {

    private class BarChartFormatter: NSObject, IAxisValueFormatter {

        var labels: [String] = []

        func stringForValue(_ value: Double, axis: AxisBase?) -> String {
            return labels[Int(value)]
        }

        init(labels: [String]) {
            super.init()
            self.labels = labels
        }
    }

    func setBarChartData(xValues: [String], yValues: [Double], label: String) {

        var dataEntries: [BarChartDataEntry] = []

        for i in 0..<yValues.count {
            let dataEntry = BarChartDataEntry(x: Double(i), y: yValues[i])
            dataEntries.append(dataEntry)
        }

        let chartDataSet = BarChartDataSet(values: dataEntries, label: label)
        let chartData = BarChartData(dataSet: chartDataSet)

        let chartFormatter = BarChartFormatter(labels: xValues)
        let xAxis = XAxis()
        xAxis.valueFormatter = chartFormatter
        self.xAxis.valueFormatter = xAxis.valueFormatter

        self.data = chartData
    }
} 

Verwendung

func setChart(){
        let months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
        let unitsSold = [20.0, 4.0, 3.0, 6.0, 12.0, 16.0, 4.0, 18.0, 2.0, 4.0, 5.0, 4.0]

        barChartView.setBarChartData(xValues: months, yValues: unitsSold, label: "Monthly Sales")
    } 

Alle 33 Kommentare

Ich ändere den x-Achsenwert im Streudiagramm und es funktioniert jetzt.
Ich habe 2 Punkte gefunden:

1: let dataEntry = BarChartDataEntry(x: Double(i+2), y:values[i], data:months )
Verwenden Sie ChartDataEntry(x,y) anstelle der Methode BarChartDataEntry.

2: let chartData = BarChartData() -> let chartData = BarChartData(dataset)

Hoffe es kann dir helfen.

Danke NyoSeint, du hast Recht mit deiner Methode, du kannst die x-Achse ändern, aber nur auf numerische Weise, ich versuche, Strings in diesem Fall Monate in die x-Achse zu schreiben

Haben Sie die ChartsDemo überprüft? Ich glaube, es gibt Antworten.

Ich suche auch nach einer Antwort darauf, habe hier früher einen Fall eröffnet - https://github.com/danielgindi/Charts/issues/1331

Konnte in den Demos keine Antwort finden, bitte lassen Sie es mich wissen, wenn Sie eine Lösung finden. Danke

Ich habe die Lösung gefunden, vielleicht kann ein anderer dieses Problem besser lösen, ohne eine neue Klasse zu erstellen, nun, das habe ich gefunden:

Zuerst müssen Sie eine neue Klasse erstellen, die Ihre Formatierungsklasse sein wird, und die IAxisValueFormater-Schnittstelle hinzufügen, dann verwenden Sie die Methode stringForValue, um die neuen Werte anzupassen, es werden zwei Parameter benötigt, der erste ist der tatsächliche Wert (Sie können es so sehen der Index) und zweitens die Achse, auf der sich der Wert befindet.

import UIKit
import Foundation
import Charts

@objc(BarChartFormatter)
public class BarChartFormatter: NSObject, IAxisValueFormatter{

var months: [String]! = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]


public func stringForValue(value: Double, axis: AxisBase?) -> String {

    return months[Int(value)]
}

}

Jetzt müssen Sie in Ihrer Datei am Anfang Ihrer Funktion setChart() zwei Variablen erstellen, eine für Ihre Formatiererklasse und eine für die Achsenklasse:

let formato:BarChartFormatter = BarChartFormatter()
let xaxis:XAxis = XAxis()

Fahren Sie als Nächstes am Ende der for in-Schleife fort und übergeben Sie den Index und die Achse an Ihre Formatierungsvariable:

formato.stringForValue(Double(i), axis: xaxis)

Fügen Sie nach dem Schleifen das Format zu Ihrer Achsenvariablen hinzu:

xaxis.valueFormatter = formato

Der letzte Schritt besteht darin, das neue xaxisformatted zur barChartView hinzuzufügen:

barChartView.xAxis.valueFormatter = xaxis.valueFormatter

Und das sind alle anderen Zeilen in der Funktion setChart(). Behalten Sie sie einfach dort, wo sie sind. Ich hoffe, es kann Ihnen helfen.

@ajimenezjulio Das ist in der Tat der richtige Weg :-)

Wir verwenden jetzt Formatierer aufgrund unabhängiger x-Werte. Dies ist natürlich weniger komfortabel für diejenigen, die früher ein vereinfachtes X-Index-Array hatten, eröffnet aber eine ganze Welt von Möglichkeiten. Dadurch wurde die Einschränkung aufgehoben, die x-Indizes mit ihren Labels vordefinieren zu müssen.

Ich bin mir sicher, dass wir in Zukunft neue Wege finden werden, weniger Code für einfache Situationen wie diese zu schreiben.

Bitte geben Sie uns eine einfache Möglichkeit zurück, die xaxis anzupassen.
Die vorherige Version war so schön dafür! (oder zumindest ein Tutorial für Swift/Objc)

Vielen Dank.

Irgendein Update ?

@dante20007 Tut mir leid, du kannst nicht alles haben. Die Leute möchten in der Lage sein, Einträge an jedem x-Index hinzuzufügen, nicht nur 0, 1, 2, sondern auch 0, 1,3, 2,7 ... Ein Array kann keine Labels für solche Werte darstellen.

Was ist, wenn wir Monate auf der X-Achse angezeigt haben möchten? auch nicht möglich?

Vielen Dank.

Hallo, ich versuche, diese Lösung hinzuzufügen, aber wenn ich mich nach rechts bewege, heißt es, dass der Index außerhalb des Bereichs liegt, ich weiß, dass ich nur 12 Monate habe

Ich brauche auch eine einfache Möglichkeit, die x-Achse anzupassen. Aus diesem Grund bin ich zur vorherigen Version von Diagrammen zurückgekehrt.

Dies ist eine einfache Möglichkeit, mein Problem anzupassen. Wenn ich nach rechts gehe, beginne ich erneut mit dem Rendern, also ändere ich die Lib und setze sie auf Ignorieren, wenn der Index beim Rendern angezeigt wird

Entschuldigung, ich sprach von "Wie ändert man die Werte der X-Achse in Swift?" Verwenden von Zeichenfolgen

Ja, ich auch. Ich habe dieselbe Antwort von @ajimenezjulio verwendet

Ich betreue ein Projekt, das sich in Objective-C befindet, und obwohl ich es geschafft habe, die Antwort von @ajimenezjulio zu reproduzieren, wurde es nicht kompiliert: Aus irgendeinem Grund wurde der IAxisValueFormatter nie erkannt.

Ich hatte ein ähnliches Problem. Die Dokumentation ist zu kurz, aber das Arbeiten mit der x-Achse erfordert einige Codezeilen. Mit dem von @ajimenezjulio bereitgestellten Code habe ich eine Klassenerweiterung erstellt, um die Verwendung von BarChartView zu vereinfachen. Vielleicht ist es für jemanden nützlich.

extension BarChartView {

    private class BarChartFormatter: NSObject, IAxisValueFormatter {

        var labels: [String] = []

        func stringForValue(_ value: Double, axis: AxisBase?) -> String {
            return labels[Int(value)]
        }

        init(labels: [String]) {
            super.init()
            self.labels = labels
        }
    }

    func setBarChartData(xValues: [String], yValues: [Double], label: String) {

        var dataEntries: [BarChartDataEntry] = []

        for i in 0..<yValues.count {
            let dataEntry = BarChartDataEntry(x: Double(i), y: yValues[i])
            dataEntries.append(dataEntry)
        }

        let chartDataSet = BarChartDataSet(values: dataEntries, label: label)
        let chartData = BarChartData(dataSet: chartDataSet)

        let chartFormatter = BarChartFormatter(labels: xValues)
        let xAxis = XAxis()
        xAxis.valueFormatter = chartFormatter
        self.xAxis.valueFormatter = xAxis.valueFormatter

        self.data = chartData
    }
} 

Verwendung

func setChart(){
        let months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
        let unitsSold = [20.0, 4.0, 3.0, 6.0, 12.0, 16.0, 4.0, 18.0, 2.0, 4.0, 5.0, 4.0]

        barChartView.setBarChartData(xValues: months, yValues: unitsSold, label: "Monthly Sales")
    } 

Hey, kann man auch andere Diagrammerweiterungen haben?

Ich erhalte eine Fehlermeldung „BarChartFormatter entspricht nicht dem Protokoll IAxisValueFormatter.

Warum hast du das getan? Es war so einfach in Android Studio zu verwenden. Weiß JEMAND, wie man ein Array ["J", "F", etc... in die X-Achse bekommt? Ich bin hier am Arsch. Diese "Beispiele liegen über meinem Können.

Gibt es eine Lösung für ObjC, um die X-Achse mit benutzerdefinierten Beschriftungen zu formatieren?

Deklarieren Sie in YourViewControllerViewController var Monate: [String] = String und legen Sie die Werte des Monats fest, den Sie benötigen
Erweiterung YourViewControllerViewController: IAxisValueFormatter {
func stringForValue(_ value: Double, axis: AxisBase?) -> String {
Rückgabemonate[Int(Wert) % Monate.Anzahl]
}
}

Hallo,
Ich habe versucht, die Lösung hinzuzufügen. Aber ich bekomme immer einen Fehler "Index außerhalb des Bereichs".

Ja, ich wünschte, ich hätte mehr verstanden, wie stringForValue aufgerufen wird und wie Ihre Anpassung des Diagramms/der Daten die Art und Weise ändert, wie es für Ihre Daten aufgerufen wird. Ich habe einige dieser Überprüfungen durchgeführt, um zu vermeiden, dass der Index außerhalb des Bereichs liegt. Allerdings eine Art Pflaster 🤷‍♂️

       func stringForValue(_ value: Double, axis: AxisBase?) -> String {
            let index = Int(value)
            if index < labels.count && index >= 0 {
                return labels[index]
            } else {
                return ""
            }
        }

Öffnen-Schaltfläche

@robotsquidward - Ich auch. Es wäre schön, wenn die Dokumentation erklärt, wie es funktioniert, oder noch besser, eine der Demos zeigt, wie es geht. Ich kann mir vorstellen, dass es _viele_ Leute gibt, die Strings für Labels verwenden müssen, aber ich kann keine klare Erklärung oder Beispiel finden, die helfen würden. Ich sehe nur eine Reihe von Antworten, die look at stringForValue() sagen. Seufzen...

@AlexSmet
Vielen Dank für die Erweiterung! Es funktioniert großartig. Ich verwende ein Liniendiagramm, also habe ich den Code ein wenig modifiziert. Es funktioniert, aber ich habe einen visuellen Fehler. Irgendeine Idee, warum die Tage auf der X-Achse nicht richtig ausgerichtet sind? Auch Montag und Mittwoch werden 2 mal hintereinander angezeigt.
Siehe Screenshot: https://imgur.com/a/OG7OuSY

dataContent1 = ["MO", "DI", "WED", "DO", "FR"]
dataContent2 = [230, 320, 403, 430, 312]
chartView.setLineChartData(xValues: dataContent1, yValues: dataContent2, Bezeichnung: „BTC“)

@benzai
Sie müssen eine Beschriftungsanzahl für xAxis festlegen. Wenn Sie Code wie in meiner Erweiterung verwenden, fügen Sie einfach eine Zeichenfolge in Ihre setLineChartData-Funktion ein:
self.xAxis.setLabelCount(xValues.count, force: true)

@benzai Ich musste den Ansatz von @AlexSmet leicht anpassen und force: false einstellen, damit mein Diagramm 12 Monate korrekt anzeigt:

barChartView.xAxis.setLabelCount(dataPoints.count, force: false)

Wenn force auf true gesetzt war, forderte das Diagramm seltsame xAxis-Werte im Formatter-Delegat an (z. B. -0,5 statt 0,0) und die Beschriftungen wurden nicht korrekt mit dem entsprechenden yValue ausgerichtet.

Das Dokumentations-Markup sagt: "Wenn wahr, wird die festgelegte Anzahl von y-Beschriftungen erzwungen", was bedeutet, dass dies speziell für die y-Beschriftungen gilt, aber es hört sich so an, als ob es sowohl für x- als auch für y-Achsenbeschriftungen gilt, richtig?

Kann ich die String-Beschriftung auf der linken Achse festlegen?

Zum Liniendiagramm:

self.lineChart.xAxis.valueFormatter = IndexAxisValueFormatter(values: self.chartLabels)
self.lineChart.xAxis.avoidFirstLastClippingEnabled = true

Wie geht es dir heute.
Bitte helfen Sie mir, ich möchte den Wert mit Balkendiagrammen des Swift 4-Projekts festlegen.

tE1U5
Ich möchte diese Art von Liniendiagramm zeichnen.
Wie fügt man zwischen zwei Zeitintervallen mehrere Punkte hinzu? (Beispiel, möchte mehrere Punkte zwischen 7 und 8 Uhr anzeigen)

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen