Search code examples
iosswiftios-chartscombinedchart

How to have charts of the same type (ie LineChart) on the same axis using Daniel Gindi's chart library?


I have a graph that will display multiple line charts and scatter charts on the same axis. They will all have identical x-axis. I cannot seem to have multiple lineCharts be inside the same axis.

I have tried implementing CombinedChartView. I have created a function that takes in arrays for the respective dataset.

    func customiseChart (rule1x: [Double], rule1y: [Double], rule2x: [Double], rule2y: [Double], rule3x: [Double], rule3y: [Double], rule4x: [Double], rule4y: [Double], rule5x: [Double], rule5y: [Double], rule6x: [Double], rule6y: [Double], rule7x: [Double], rule7y: [Double], suppressedSparksX: [Double], suppressedSparksY: [Double], exsuppressedSparksX: [Double], exsuppressedSparksY: [Double], CombinedChartView: CombinedChartView, labelRule1: String, labelRule2: String, labelRule3: String, labelRule4: String, labelRule5: String, labelRule6: String, labelRule7: String, labelSuppressed: String, labelExsuppressed: String)  {

        //1) set ChartDataEntry for all the graphs
        var rule1ChartEntries: [ChartDataEntry] = []
        for i in 0..<rule1y.count {
            let entries = ChartDataEntry(x: rule1x[i], y: rule1y[i])
            rule1ChartEntries.append(entries)
        }

          . . .

        var rule7ChartEntries: [ChartDataEntry] = []
        for i in 0..<rule7y.count {
            let entries = ChartDataEntry(x: rule7x[i], y: rule7y[i])
            rule7ChartEntries.append(entries)
        }
        var suppressedScatterChartEntries: [ChartDataEntry] = []
        for i in 0..<suppressedSparksY.count {
            let entries = ChartDataEntry(x: suppressedSparksX[i], y: suppressedSparksY[i])
            suppressedScatterChartEntries.append(entries)
        }
        var exsuppressedScatterChartEntries: [ChartDataEntry] = []
        for i in 0..<exsuppressedSparksY.count {
            let entries = ChartDataEntry(x: exsuppressedSparksX[i], y: exsuppressedSparksY[i])
            exsuppressedScatterChartEntries.append(entries)
        }

        //2) set ChartDataSet for all the charts
        let rule1DataSet = LineChartDataSet(entries: rule1ChartEntries, label: labelRule1)
        rule1DataSet.colors = [NSUIColor.black]
        let rule1data = LineChartData()
        rule1data.addDataSet(rule1DataSet)
        rule1DataSet.drawCirclesEnabled = false
        rule1DataSet.drawValuesEnabled = false

        let rule2DataSet = LineChartDataSet(entries: rule2ChartEntries, label: labelRule2)
        rule2DataSet.colors = [NSUIColor.darkGray]
        let rule2data = LineChartData()
        rule2data.addDataSet(rule2DataSet)
        rule2DataSet.drawCirclesEnabled = false
        rule2DataSet.drawValuesEnabled = false

           . . .

        let rule7DataSet = LineChartDataSet(entries: rule7ChartEntries, label: labelRule7)
        rule7DataSet.colors = [NSUIColor.yellow]
        let rule7data = LineChartData()
        rule7data.addDataSet(rule7DataSet)
        rule7DataSet.drawCirclesEnabled = false
        rule7DataSet.drawValuesEnabled = false

        let suppressedSparkDataSet = ScatterChartDataSet(entries: suppressedScatterChartEntries, label: labelSuppressed)
        suppressedSparkDataSet.colors = [NSUIColor.red]
        let suppressedData = ScatterChartData()
        suppressedData.addDataSet(suppressedSparkDataSet)

        let exsuppressedSparkDataSet = ScatterChartDataSet(entries: exsuppressedScatterChartEntries, label: labelExsuppressed)
        exsuppressedSparkDataSet.colors = [NSUIColor.blue]
        let exsuppressedData = ScatterChartData()
        exsuppressedData.addDataSet(exsuppressedSparkDataSet)

        // 3) set combinedData
        let combinedData = CombinedChartData()
        combinedData.lineData = rule1data
        combinedData.lineData = rule2data
        combinedData.lineData = rule3data
        combinedData.lineData = rule4data
        combinedData.lineData = rule5data
        combinedData.lineData = rule6data
        combinedData.lineData = rule7data

        combinedData.scatterData = suppressedData
        combinedData.scatterData = exsuppressedData

        //4) assign all the data into the combined chart
        CombinedChartView.data = combinedData

    }

I want all the graphs to be displayed on the chart. However, only the last declared lineChart and ScatterChart are displayed, meaning only rule7data and exsuppressedData are on the chart. The rest of the graph isn't displayed.


Solution

  • Basically, you create new vars. You create Arrays of the type of the dataset of the type of chart you want.

    var allLineChartDataSets: [LineChartDataSet] = [LineChartDataSet]()
    var allScatterDataSets: [ScatterChartDataSet] = [ScatterChartDataSet]()
    
    //1) set ChartDataEntry for all the graphs
    var rule1ChartEntries: [ChartDataEntry] = []
        for i in 0..<rule1y.count {
            let entries = ChartDataEntry(x: rule1x[i], y: rule1y[i])
            rule1ChartEntries.append(entries)
    
    . . .
    
    

    Then, you append your individual data sets into the DataSets arrays declared above like this:

    //2) set ChartDataSet for all the charts
    let rule1DataSet = LineChartDataSet(entries: rule1ChartEntries, label: labelRule1)
    rule1DataSet.colors = [NSUIColor.black]
    let rule1data = LineChartData()
    rule1data.addDataSet(rule1DataSet)
    rule1DataSet.drawCirclesEnabled = false
    rule1DataSet.drawValuesEnabled = false
    allLineChartDataSets.append(rule1DataSet)
    
    . . .
    

    Do this for the scatterChart as well, or any other chart of your choice.

    Lastly,

    // 3) set combinedData
    let lineChartDataSets = LineChartData(dataSets: allLineChartDataSets)
    let scatterChartDataSets = ScatterChartData(dataSets: allScatterDataSets)
    let combinedData = CombinedChartData()
    combinedData.lineData = lineChartDataSets
    combinedData.scatterData = scatterChartDataSets
    
    //4) assign all the data into the combined chart
    CombinedChartView.data = combinedData