danaq
danaq

Reputation: 117

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.

Upvotes: 1

Views: 372

Answers (2)

danaq
danaq

Reputation: 117

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

Upvotes: 0

AjinkyaSharma
AjinkyaSharma

Reputation: 1979

Instead of doing it this way

    let rule1data = LineChartData()
    rule1data.addDataSet(rule1DataSet)

You can add multiple data sets to one LineChartData

so you can do:

let allLineDatas = LineChartData(dataSets: [rule1DataSet, rule2DataSet,....])


combinedData.lineData = allLineDatas

same for others.

combinedData.scatterData = allScatterDatas

You can download their sample project and run in simulator, you will find all sorts of examples there and then you can find the code for the examples you need to integrate

Upvotes: 1

Related Questions