【问题标题】:Combined Chart (line- and bar chart) using iOS-Charts使用 iOS 图表的组合图表(折线图和条形图)
【发布时间】:2020-08-24 14:20:47
【问题描述】:

我正在尝试在 swift (iOS 图表) 中组合折线图和条形图。 x 轴和 y 轴似乎都已正确缩放,但数据未显示在图表上。我错过了什么?

import UIKit
import Charts

class CombinedChartsTest: UIViewController {


@IBOutlet weak var combinedChart: CombinedChartView!


let months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
let unitsSold = [2.0, 4.0, 6.0, 3.0, 12.0, 16.0, 4.0, 17.0, 2.0, 4.0, 5.0, 4.0]

override func viewDidLoad() {
    super.viewDidLoad()

    setChart(months, yValuesLineChart:  unitsSold, yValuesBarChart: unitsSold)
}

func setChart(xValues: [String], yValuesLineChart: [Double], yValuesBarChart: [Double]) {
    combinedChart.noDataText = "Please provide data for the chart."

    var yVals1 : [ChartDataEntry] = [ChartDataEntry]()
    var yVals2 : [BarChartDataEntry] = [BarChartDataEntry]()

    for i in 0..<xValues.count {

        yVals1.append(ChartDataEntry(value: yValuesLineChart[i], xIndex: i))
        yVals2.append(BarChartDataEntry(value: yValuesBarChart[i] - 1, xIndex: i))

    }

    let lineChartSet = LineChartDataSet(yVals: yVals1, label: "Line Data")
    let barChartSet: BarChartDataSet = BarChartDataSet(yVals: yVals2, label: "Bar Data")

    let data: CombinedChartData = CombinedChartData(xVals: xValues, dataSets: [lineChartSet,barChartSet])

    combinedChart.data = data

}
}

【问题讨论】:

    标签: swift ios-charts


    【解决方案1】:

    我终于设法弄清楚缺少什么。

    import UIKit
    import Charts
    
    class CombinedChartsTest: UIViewController {
    
    
    @IBOutlet weak var combinedChartView: CombinedChartView!
    
    
    let months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
    let unitsSold = [2.0, 4.0, 6.0, 3.0, 12.0, 16.0, 4.0, 17.0, 2.0, 4.0, 5.0, 4.0]
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        setChart(months, yValuesLineChart:  unitsSold, yValuesBarChart: unitsSold)
    }
    
    func setChart(xValues: [String], yValuesLineChart: [Double], yValuesBarChart: [Double]) {
        combinedChartView.noDataText = "Please provide data for the chart."
    
        var yVals1 : [ChartDataEntry] = [ChartDataEntry]()
        var yVals2 : [BarChartDataEntry] = [BarChartDataEntry]()
    
        for i in 0..<xValues.count {
    
            yVals1.append(ChartDataEntry(value: yValuesLineChart[i], xIndex: i))
            yVals2.append(BarChartDataEntry(value: yValuesBarChart[i] - 1, xIndex: i))
    
        }
    
        let lineChartSet = LineChartDataSet(yVals: yVals1, label: "Line Data")
        let barChartSet: BarChartDataSet = BarChartDataSet(yVals: yVals2, label: "Bar Data")
    
    
        let data: CombinedChartData = CombinedChartData(xVals: xValues)
        data.barData = BarChartData(xVals: xValues, dataSets: [barChartSet])
        data.lineData = LineChartData(xVals: xValues, dataSets: [lineChartSet])
    
        combinedChartView.data = data
    
    }
    }
    

    【讨论】:

    • 谁能建议我如何用 Swift3x 做同样的事情
    • 你用的是哪个版本的swift和charts?我没有具有参数 == "xVals" 的 combineChartData 的 init 方法,我只有 init(dataSets: [IChartDataSet]?) 方法,而 IChartDateSets 没有任何 init,因为它是一个协议。
    • 那么,遗漏了什么?
    • @AkhileshSharma 我遇到了同样的问题 - 组合图表没有 xVals。你能解决这个问题吗?
    【解决方案2】:

    我是这样用的

    `

    func setChart(xValues: [String], yValuesLineChart: [Double], yValuesBarChart: [Double] , combinedChartView:CombinedChartView) {
        combinedChartView.noDataText = "Please provide data for the chart."
    
        var yVals1 : [ChartDataEntry] = [ChartDataEntry]()
        var yVals2 : [BarChartDataEntry] = [BarChartDataEntry]()
    
        for i in 0..<xValues.count {
    
            yVals1.append(ChartDataEntry(value: yValuesLineChart[i], xIndex: i))
            yVals2.append(BarChartDataEntry(value: yValuesBarChart[i] , xIndex: i))
    
        }
    
    
        let lineChartSet = LineChartDataSet(yVals: yVals1, label: "Line Data")
        lineChartSet.colors = [UIColor(red: 168.0/255.0, green: 164.0/255.0, blue: 164.0/255.0, alpha: 1.0)]
    
        // lineChartSet.mode = .CubicBezier
        lineChartSet.lineWidth = 5.0
        lineChartSet.drawCirclesEnabled = false
        //lineChartSet.drawFilledEnabled = true
        /*lineChartSet.colors = [UIColor(red: 0, green: 0, blue: 1, alpha: 0.0)]
         lineChartSet.fillColor = UIColor(red: 1, green: 0, blue: 0, alpha: 1.0)
         lineChartSet.fillAlpha = 0.8*/
    
    
    
        let barChartSet: BarChartDataSet = BarChartDataSet(yVals: yVals2, label: "Bar Data")
        // barChartSet.colors = ChartColorTemplates.colorful()
        barChartSet.barSpace = 0.65
    
        barChartSet.barShadowColor = UIColor(red: 1, green: 0, blue: 0, alpha: 0)// If alpha is > 0, then grey bars will appear.
    
    
    
        let data: CombinedChartData = CombinedChartData(xVals: xValues)
        data.barData = BarChartData(xVals: xValues, dataSets: [barChartSet])
        data.lineData = LineChartData(xVals: xValues, dataSets: [lineChartSet])
        //barChartView.leftAxis.startAtZeroEnabled = true
        combinedChartView.leftAxis.axisMinValue = 0
    
        combinedChartView.data = data
    
        combinedChartView.leftAxis.drawLabelsEnabled = false
        combinedChartView.rightAxis.drawLabelsEnabled = false
        //barChartView.leftAxis.startAtZeroEnabled = true
        combinedChartView.leftAxis.axisMinValue = 0
        combinedChartView.descriptionText = ""
        combinedChartView.legend.enabled = false
        combinedChartView.backgroundColor = UIColor.clearColor()
        //  combinedChartView.barSpace = 0.65
    
    
        combinedChartView.leftAxis.gridColor = UIColor(red: 179.0/255.0, green: 179.0/255.0, blue: 179.0/255.0, alpha: 0.2)
        combinedChartView.rightAxis.gridColor = UIColor(red: 179.0/255.0, green: 179.0/255.0, blue: 179.0/255.0, alpha: 0.2)
    
    }
    

    `

    【讨论】:

    • 请为您的答案添加一些解释。只显示代码可能会造成混淆。
    • 谁能建议我如何用 Swift3x 做同样的事情