In meinem Liniendiagramm habe ich es so eingerichtet, dass bei nur einer Dateneingabe der Datenpunkt wie folgt in der Mitte angezeigt wird:
Wenn es mehr Dateneinträge gibt, sieht es eher so aus:
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.
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
So sieht mein Diagramm aus, wenn avoidFirstLastClippingEnabled
auf true gesetzt wird:
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
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
Hilfreichster Kommentar
Dies hilft bei der Anzeige des letzten Werts des Liniendiagramms - ich habe es versucht und für mich gearbeitet