2016-04-06 6 views
1

Ich erstelle ein mehrzeiliges Diagramm mit der Bibliothek ios-charts. (danielgindi/Diagramme). Ich erstelle ein Array für die X-Achse, die von Core Data abgerufen wird und wenn es keinen Wert für x Woche gibt, fügte ich eine 0.Multiple Liniendiagramm, möchte keine 0 Werte darstellen. Swift 2

Ich habe ein Beispiel Array von (für die X-Werte):

[[0,0,0,0,5,6,3,0,6,0,5,4,2,1,0,0,0,0,1,3,4,1,0,0], [5.2,0.0,3,2,7.0,8,9,0.0,5.0,0.0,4,6,0.0] , 0.0,0.0], [3.6,1.5,3.6,0.0,0.0,3.5,0.0,4.6,5.6,2.8,8.4,0.0]]

und für die y:

[Jan, Feb, März, April, Mai, Juni, Juli, August, September, Oktober, November, Dezember]

Ich habe den folgenden Code, der diese drei Zeilen in einem Liniendiagramm angezeigt werden:

func setChart(xValues: [NSDate], valuesLineChart: [[Double]]) { 
    chartView.descriptionText = "" 
    chartView.noDataText = "You need to provide data for the chart." 

    var dataSets : [LineChartDataSet] = [LineChartDataSet]() 
    var yVals1 : [ChartDataEntry] = [ChartDataEntry]() 
    for i in 0..<xValues.count { 
     yVals1.append(ChartDataEntry(value: valuesLineChart[0][i], xIndex: i)) 
    } 

    var yVals2 : [ChartDataEntry] = [ChartDataEntry]() 
    for i in 0..<xValues.count { 
     yVals2.append(ChartDataEntry(value: valuesLineChart[1][i], xIndex: i)) 
    } 

    var yVals3 : [ChartDataEntry] = [ChartDataEntry]() 
    for i in 0..<xValues.count { 
     yVals3.append(ChartDataEntry(value: valuesLineChart[2][i], xIndex: i)) 
    } 

    let set1 = LineChartDataSet(yVals: yVals1, label: nil) 
    let set2 = LineChartDataSet(yVals: yVals2, label: nil) 
    let set3 = LineChartDataSet(yVals: yVals3, label: nil) 

    set1.fillColor = UniversalStatic.data.colourArrayForGraph[0] 
    set2.fillColor = UniversalStatic.data.colourArrayForGraph[1] 
    set3.fillColor = UniversalStatic.data.colourArrayForGraph[2] 

    dataSets.append(set1) 
    dataSets.append(set2) 
    dataSets.append(set3) 

    set1.setColor(UniversalStatic.data.colourArrayForGraph[0]) 
    set2.setColor(UniversalStatic.data.colourArrayForGraph[1]) 
    set3.setColor(UniversalStatic.data.colourArrayForGraph[2]) 

    set1.lineWidth = 2 
    set2.lineWidth = 2 
    set3.lineWidth = 2 

    set1.setCircleColor(UniversalStatic.data.colourArrayForGraph[0]) 
    set2.setCircleColor(UniversalStatic.data.colourArrayForGraph[1]) 
    set3.setCircleColor(UniversalStatic.data.colourArrayForGraph[2]) 

    set1.drawCircleHoleEnabled = false 
    set2.drawCircleHoleEnabled = false 
    set3.drawCircleHoleEnabled = false 

    set1.circleRadius = 5.0 
    set2.circleRadius = 5.0 
    set3.circleRadius = 5.0 

    let data: CombinedChartData = CombinedChartData(xVals: xValues) 
    data.lineData = LineChartData(xVals: xValues, dataSets: dataSets) 

    chartView.data = data 

} 

Wie kann ich die 0-Werte vermeiden Plotten?

Vielen Dank für jede Hilfe

Antwort

1

Suchen Sie ganz die Werte 0.0 überspringen? Sie können überprüfen, bevor Sie sie an das Array anhängen.

Vielleicht können Sie tun:

var yVals1 : [ChartDataEntry] = [ChartDataEntry]() 
    for i in 0..<xValues.count { 
     if valuesLineChart[0][i] != 0.0 { 
      yVals1.append(ChartDataEntry(value: valuesLineChart[0][i], xIndex: i)) 
     } 
    } 

Und in ähnlicher Weise mit der anderen für Schleifen

+0

Ja, ich möchte es komplett überspringen. Ich dachte darüber nach, aber ich dachte nicht, dass das funktionieren würde. Zum Beispiel [0.0.0.0.5.6] & [Jan, Feb, March], wenn ich die ersten 2 überspringe, würde ich Jan nicht einfach die 5.6 zuweisen? –

+0

Okay, ich sehe, was Sie jetzt wollen ... Sie möchten Zeilenumbrüche innerhalb des Diagramms. Ich glaube, es gab Entwickler in der Vergangenheit, die diese Funktion für die Bibliothek angefordert haben, aber soweit ich sagen kann, müsste man jede neue Zeile nach einem Zeilenumbruch isolieren und als neuen Datensatz implementieren ... Es wird, gelinde gesagt, komplex wegen Problemen mit der Art, wie der Bezier-Pfad gezeichnet wurde. Ich bin mir nicht sicher, ob es jetzt möglich ist. – Shen

+0

Ah ok. Ich möchte nicht wirklich Zeilenumbrüche, nur kein Kreis auf den 0.0-Werten angezeigt und überspringt es, fast wie Ändern der 0 für Null. –

1

Der einzige Weg, die Sie tun können, dass das Standardverhalten überschreibt.

Es ist ziemlich einfach eigentlich, erstellen Sie eine Unterklasse von LineChartRenderer und außer Kraft setzen drawLinear (Linien), drawValues (Wert Rendering) und drawExtras (Kreise).

Kopieren Sie einfach die Implementierung der Superklassenmethoden (LineChartRenderer) und fügen Sie die erforderliche Bedingung hinzu, um Nullwerte zu überspringen.

Weisen Sie dann den benutzerdefinierten Renderer Ihrer Diagrammansicht zu.

Eine andere Option, die wahrscheinlich funktionieren würde, ohne den Renderer zu überschreiben, besteht darin, für jeden Wert eine Farbe anzugeben. Dann können Sie einfach eine klare Farbe für Nullwerte setzen.

+0

Danke, ich bin neu in der Programmierung im Allgemeinen, werde es aber versuchen. Wird beim Setzen einer Farbe für jeden Wert, die Zeile 0 nicht angehängt, immer noch angezeigt? Im Idealfall werden für die 0-Werte der Wert davor und danach mit einer Linie verbunden. –

+0

würde die zweite Option funktionieren? Da ich sehr neu in der Programmierung bin, scheint die erste Option ein wenig schwierig zu sein, da ich nicht wirklich wissen würde, wo ich anfangen soll. –

+0

@JessMurray Die zweite ist nur eine Idee und ich bin mir nicht sicher, ob es für Ihren Anwendungsfall richtig funktionieren würde. Der erste ist sicher, aber es ist mehr Arbeit. – Sulthan