Charts: LineChart X-Achse - So zeigen Sie immer das erste und letzte Etikett an

Erstellt am 26. Dez. 2016  ·  21Kommentare  ·  Quelle: danielgindi/Charts

In meinem Liniendiagramm habe ich es so eingerichtet, dass bei nur einer Dateneingabe der Datenpunkt wie folgt in der Mitte angezeigt wird:

screen shot 2016-12-25 at 7 00 36 pm

Wenn es mehr Dateneinträge gibt, sieht es eher so aus:

screen shot 2016-12-25 at 7 00 50 pm

Das Problem, das ich habe, ist, dass das letzte Etikett auf der X-Achse nicht angezeigt wird. Dies sind Daten aus den letzten 30 Tagen, daher möchte ich, dass das letzte Etikett, der 25. Dezember, angezeigt wird. Gibt es eine Möglichkeit, in meinem Liniendiagramm immer die erste und letzte Beschriftung auf der X-Achse anzuzeigen? Es ist mir egal, wie die Beschriftungen dazwischen berechnet oder übersprungen werden.

bug

Hilfreichster Kommentar

    lineChart?.xAxis.setLabelCount(arrOfMonth.count, force: true)

Dies hilft bei der Anzeige des letzten Werts des Liniendiagramms - ich habe es versucht und für mich gearbeitet

Alle 21 Kommentare

versuche avoidFirstLastClippingEnabled , Standard ist false.

    /// if set to true, the chart will avoid that the first and last label entry in the chart "clip" off the edge of the chart
    open var avoidFirstLastClippingEnabled = false

@ cnowak7 Konnten Sie das im 2. Bild erwähnte Problem lösen? Bitte teilen Sie die Lösung

avoidFirstLastClippingEnabled hilft nicht. Das letzte Etikett wird immer geschnitten

Wenn ich mir den Quellcode anschaue, werden die Achseneinträge in AxisRendererBase.computeAxisValues berechnet und es gibt keine Möglichkeit, den anzuzeigenden Maximalwert zu erzwingen. Ich glaube jedoch, dass diese Funktionalität in der vorherigen Version unterstützt wurde.

https://github.com/danielgindi/Charts/issues/2007 scheint das gleiche Problem mit diesem zu sein?
@ondrejhanslik standardmäßig benötigt computeAxisValues ​​() einen minimalen und einen maximalen Wert, um den Bereich zu berechnen. Der Min- und Max-Wert sollte daher größer sein als der Min / Max-Wert der Daten, um alle Daten aufzunehmen. Haben Sie überprüft, wie hoch Ihr Min / Max-Wert in computeAxisValues ​​() ist und wie hoch der Min / Max-Wert Ihrer Daten ist?

@ liuxuan30 Ich verwende ein benutzerdefiniertes String-Array als X-Achsen-Werte, dh Datumsangaben

Hier ist ein Screenshot meines Diagramms

untitled

So sieht mein Diagramm aus, wenn avoidFirstLastClippingEnabled auf true gesetzt wird:

screen shot 2016-12-28 at 11 02 15 pm

Hier ist ein zusätzlicher Code, mit dem ich meine X-Achse einrichte:

private func setUpLineChartPreferences() {
        .
        .
        .
        // x-axis
        self.lineChart.xAxis.labelPosition = .bottom
        self.lineChart.xAxis.drawGridLinesEnabled = true
        self.lineChart.xAxis.granularity = 1.0
        .
        .
        .
}
private func setUpLineChart(withDataEntries entries: [ChartDataEntry]) {
        let entryCount = entries.count
        if entryCount > 0 {
            let dataSet = LineChartDataSet(values: entries, label: nil)
            dataSet.drawFilledEnabled = true
            dataSet.fillColor = .green
            dataSet.circleRadius = 5
            dataSet.drawValuesEnabled = false
            dataSet.setColor(.black)
            dataSet.highlightColor = .green
            dataSet.setCircleColor(.blue)
            let lineChartData = LineChartData(dataSet: dataSet)
            self.lineChart.data = lineChartData
            // SET UP X-AXIS
            self.lineChart.xAxis.valueFormatter = IndexAxisValueFormatter(values: self.chartLabels)
            self.lineChart.xAxis.avoidFirstLastClippingEnabled = true
            print("NOWAK: CHART LABELS THO - \(self.chartLabels)")
            if entryCount == 1 {
                self.lineChart.xAxis.axisMinimum = -1.0
                self.lineChart.xAxis.axisMaximum = 1.0
            } else {
                self.lineChart.xAxis.axisMinimum = 0.0
                self.lineChart.xAxis.axisMaximum = Double(self.chartLabels.count - 1)
            }
            print("X MIN IS \(self.lineChart.xAxis.axisMinimum) AND X MAX IS \(self.lineChart.xAxis.axisMaximum)")
        } else {
            self.lineChart.noDataText = "No Stats For The Past \(self.currentFilter.capitalized)"
            self.lineChart.setNeedsDisplay()
        }
        switch self.currentFilter {
        case "week":
            self.weekFilterButton.backgroundColor = .blue
            self.monthFilterButton.backgroundColor = .darkGray
            self.yearFilterButton.backgroundColor = .darkGray
        case "month":
            self.monthFilterButton.backgroundColor = .blue
            self.weekFilterButton.backgroundColor = .darkGray
            self.yearFilterButton.backgroundColor = .darkGray
        case "year":
            self.yearFilterButton.backgroundColor = .blue
            self.weekFilterButton.backgroundColor = .darkGray
            self.monthFilterButton.backgroundColor = .darkGray
        default:
            print("ERROR SETTING FILTER BUTTON BACKGROUND COLORS")
        }
        self.stopLoading()
}

Ich benutze übrigens Charts 3.0.1 :)

Hier gilt das gleiche. Diagramme 3.0.1 , XCode 8.0 und Swift 3.0

Wenn für diese Situation keine Lösung möglich ist, besteht eine Problemumgehung wahrscheinlich darin, bei Anzeige des Diagramms den letzten Wert (heute) hervorzuheben, damit der "BalloonMarker" den Text "Dec XX \ n500 ".

Auf meiner Seite natürlich :)

OK, ich habe es überprüft.

In Diagramm 3.0 verhält sich die x-Achse wie die y-Achse, sodass Sie Ihre y-Achsenbeschriftungen überprüfen können. Die größte y-Achsenbeschriftung ist kleiner als der Maximalwert der Daten in
image

In computeAxisValues() liest es den Min- und Max-Wert aus dem Min / Max-Wert der Achse (dem Min / Max-Wert der Daten) und berechnet ein Intervall, um die Beschriftungen der x-Achse zu erhalten.

Zum Beispiel in ChartsDemo - Liniendiagramm Dual YAxis, wenn meine x-Werte zwischen 0 und 20 liegen,
computeAxisValues() nimmt 0, 20 als Min / Max-Wert an, dann ist mein labelCount standardmäßig 6, es berechnet rawInterval = (max - min) / labelCount und später ist das letzte Intervall 3. Dann Es beginnt bei 0, um 7 (labelCount + 1) Labels zu erhalten, die 0,3,6,9,12,15,18 sind. Die letzte Beschriftung der x-Achse ist 18, nicht 20.

Der Grund, warum isAvoidFirstLastClippingEnabled nicht funktioniert, liegt darin, dass es behandelt wird, wenn das letzte Etikett nicht gebunden ist, sodass es für dieses Problem irrelevant ist.

Wenn Sie sicherstellen möchten, dass die Beschriftung der x-Wert Ihrer Daten ist, müssen Sie computeAxisValues() anpassen, um die Beschriftungen zurückzugeben. Schauen Sie sich einfach computeAxisValues() an, um die Details zu sehen, und Sie sollten in der Lage sein, sie zu ändern.

@danielgindi was denkst du für solche User Cases?

@ liuxuan30 Wir möchten computeAxisValues nicht optimieren, um bestimmte Labels zurückzugeben. Wenn ich beispielsweise ein Diagramm über Datumsangaben anzeige (z. B. x-Werte sind Wochentage, Tage eines Monats oder Monate eines Jahres), müssen das erste und das letzte Etikett angezeigt werden (z. B. Montag und Sonntag oder 1) / 1 und 31/1).

Ich generiere zuerst die formatierten Werte (z. B. Tagesnamen oder formatierte Tage) und setze sie dann wie folgt:

    xAxis.axisMinimum = 0
    xAxis.axisMaximum = Double(xValues.count - 1)
    xAxis.valueFormatter = IndexAxisValueFormatter(values: xValues)

Was ich brauche, ist ein intelligenteres computeAxisValues , das immer das erste und das letzte Etikett anzeigt und dann die Etiketten zwischen ihnen berechnet.

Dies ist ein sehr grundlegender und sehr häufiger Anwendungsfall.

Ich verstehe. Es gibt immer noch Fehler bei den Beschriftungen der x-Achse, z. B. Überlappung der Beschriftungen.
Die aktuelle Logik kennt zuerst den Min / Max-Wert und generiert daraus Intervalle und akkumuliert, um die Achsenbeschriftungen zu erhalten. Das aktuelle computeAxisValues() garantiert jedoch nicht, dass der Maximalwert / das letzte Label xAxis.axisMaximum ist. Das ist es, was ich von @danielgindi dazu brauche.

Vielleicht sollte ich für computeAxisValues ​​() 'override' anstelle von 'tweak' verwenden. Sie können eine Implementierung bereitstellen, um sicherzustellen, dass Ihr erster / letzter Wert immer als Problemumgehung angezeigt wird. Dies kann jedoch dazu führen, dass das Etikett nicht mehr gebunden ist oder andere Probleme auftreten.

Eine andere Möglichkeit ist, dass Sie versuchen können, setLabelCount(count, forceLabelEnabled) gleich Ihrer x-Wertezahl oder der Hälfte zu verwenden, um das Ergebnis zu sehen.
Die Logik ist dann ganz anders:

        // force label count
        if axis.isForceLabelsEnabled
        {
            interval = Double(range) / Double(labelCount - 1)

            // Ensure stops contains at least n elements.
            axis.entries.removeAll(keepingCapacity: true)
            axis.entries.reserveCapacity(labelCount)

            var v = yMin

            for _ in 0 ..< labelCount
            {
                axis.entries.append(v)
                v += interval
            }

            n = labelCount
        }

Es geht nicht um den zusätzlichen Prozess, sondern nur um einfache Mathematik.

@ liuxuan30 Was ist, wenn die x-

@ vaibhav-varshaaweblabs x Achse nimmt jetzt NUR in Diagramm 3.x das Doppelte an, sodass Sie valueFormatter verwenden können, um die Beschriftung anstelle des Doppelten anzuzeigen. Der valueFormatter kann jedoch kompliziert sein, wenn Sie das Zoomen / Scrollen in Betracht ziehen müssen

Hat jemand in Charts 3.0.2 eine Lösung dafür gefunden? Ich verwende Datumszeichenfolgen für meine x-Achsen-Beschriftungen und sehe, dass die letzte Beschriftung gelegentlich verschwindet, aber Probleme beim Reproduzieren hat. Dies ist mit isAvoidFirstLastClippingEnabled auf true . Ich frage mich, ob dies mit # 2563 zusammenhängen könnte?

@ vaibhav-varshaaweblabs @raudabaugh : Wie haben Sie es geschafft, Zeichenfolgen auf der X-Achse zu zeichnen, da die setDataCount-Methode int- oder double-Werte für X und Y erwartet?
Bitte lassen Sie es mich wissen, danke im Voraus

bottomAxis.setLabelCount (entry.size (), true); und setzen Sie den Rand nach rechts, um die letzte Zählung sichtbar zu machen.

    lineChart?.xAxis.setLabelCount(arrOfMonth.count, force: true)

Dies hilft bei der Anzeige des letzten Werts des Liniendiagramms - ich habe es versucht und für mich gearbeitet

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

BrandonShega picture BrandonShega  ·  4Kommentare

valeIT picture valeIT  ·  3Kommentare

brytnvmg picture brytnvmg  ·  4Kommentare

PrashantKT picture PrashantKT  ·  3Kommentare

Bharati555 picture Bharati555  ·  4Kommentare