如何使用带有Swift 3.0的danielgindi / Charts库绘制条形图

时间:2017-01-11 07:58:25

标签: swift charts swift3

问题陈述:由于在swift 3.0语法错误中使用'danielgindi / Charts库'实现Bar-Chart时出现一些错误,无法运行。

Swift 3.0中的实际错误:

enter image description here

纠正上述错误后,它会在下一行中出现另一个错误,如下所示。

enter image description here

编码资料:

import Charts

class ChartViewController: UIViewController {

    @IBOutlet var barChartView: BarChartView!

    var months: [String]!
    var dataEntries: [BarChartDataEntry] = []


    override func viewDidLoad() {
        super.viewDidLoad()

        months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
        let unitsSold = [20.0, 4.0, 6.0, 3.0, 12.0, 16.0, 4.0, 18.0, 2.0, 4.0, 5.0, 4.0]
        setChart(dataPoints: months, values: unitsSold)

    }

    func setChart(dataPoints: [String], values: [Double]) {
        barChartView.noDataText = "You need to provide data for the chart."

        for i in 0..<dataPoints.count {
            let dataEntry = BarChartDataEntry(x: Double(i), yValues: [values[i]])
            dataEntries.append(dataEntry)
        }

        let chartDataSet = BarChartDataSet(values: dataEntries, label: "Units Sold")

        let chartData = BarChartData(xVals: months, dataSet: chartDataSet)

        barChartView.data = chartData
    }

请帮助我,如何在swift 3.0中解决此类错误

4 个答案:

答案 0 :(得分:2)

我也遇到过这个问题。这是这一行:

let dataEntry = BarChartDataEntry(x: Double(i), yValues: [values[i]])

您无法将dataPoints:[String]转换为Double类型。

我的解决方案是删除Double。然后那不满足我的数据类型,所以我把它们全部都设为[Int]类似:

func setChart(dataPoints: [Int], values: [Int]) {

    self.noDataText = "You need to provide data for the chart."

    var dataEntries: [BarChartDataEntry] = []

    for i in 0..<dataPoints.count {
        let dataEntry = BarChartDataEntry(x: Double(i), y: Double(values[i]) )
        dataEntries.append(dataEntry)


    }

    let chartDataSet = BarChartDataSet(values: dataEntries, label: "Units Sold")
    let chartData = BarChartData(dataSet: chartDataSet)
    self.data = chartData

您可以将[Int]转换为Double,以便解决我的问题。我将变量月份更改为:[String]为

let months = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

答案 1 :(得分:0)

您可以将月份和单位售出的值重复为xVal和yVal。

  var barChartValues: [BarChartDataEntry] = []

    for (key,val) in self.barChartDataval.enumerated() {

        let xVal = Double(key)
        let yVal = Double(val.cost)
        let dataEntry = BarChartDataEntry(x: xVal, y: yVal!)
        barChartValues.append(dataEntry)

    }

    let chartDataSet = BarChartDataSet(values: barChartValues, label: "Expenses Summary")
    chartDataSet.colors = [Constants.k_COLORS.BLUE]
    var dataSets = [IChartDataSet]()
    dataSets.append(chartDataSet)

    let chartData = BarChartData(dataSets: dataSets)
    self.barChartView.data = chartData
    self.barChartView.chartDescription?.text = ""

    self.barChartView.animate(xAxisDuration: 2.0, yAxisDuration: 2.0, easingOption: .easeInBounce)

答案 2 :(得分:0)

对于折线图我们可以有以下

import UIKit
import Charts

class LineChartVC: UIViewController , ChartViewDelegate{
    @IBOutlet var lineChartView: LineChartView!

    var months: [String]!


    override func viewDidLoad() {
        super.viewDidLoad()
        self.lineChartSetUp()

    }

}

    extension LineChartVC{


        func  lineChartSetUp(){

            self.lineChartView.delegate = self
            self.lineChartView.chartDescription?.enabled = false//true

            self.lineChartView.dragEnabled = true
            self.lineChartView.setScaleEnabled(true)
            self.lineChartView.pinchZoomEnabled = true
            self.lineChartView.drawGridBackgroundEnabled = false


            // x-axis limit line
            /*
             let llXAxis = ChartLimitLine(limit: 10.0, label: "Index 10")
             llXAxis.lineWidth = 4.0
             llXAxis.lineDashLengths = [(10.0), (10.0), (0.0)]
             llXAxis.labelPosition = ChartLimitLine.LabelPosition.rightBottom//ChartLimitLabelPositionRightBottom
             llXAxis.valueFont = UIFont.systemFont(ofSize: 10.0)
             //[_chartView.xAxis addLimitLine:llXAxis];

             self.lineChartView.xAxis.gridLineDashLengths = [10.0, 10.0]
             self.lineChartView.xAxis.gridLineDashPhase = 0.0


             let ll1 = ChartLimitLine(limit: 150.0, label: "Upper Limit")
             ll1.lineWidth = 4.0
             ll1.lineDashLengths = [5.0, 5.0]
             ll1.labelPosition = ChartLimitLine.LabelPosition.rightTop //ChartLimitLabelPositionRightTop
             ll1.valueFont = UIFont.systemFont(ofSize: 10.0)

             let ll2 = ChartLimitLine(limit: -30.0, label: "Lower Limit")
             ll2.lineWidth = 4.0
             ll2.lineDashLengths = [5.0, 5.0]
             ll2.labelPosition = ChartLimitLine.LabelPosition.rightBottom//ChartLimitLabelPositionRightBottom
             ll2.valueFont = UIFont.systemFont(ofSize: 10.0)

             let leftAxis: YAxis? =  self.lineChartView.leftAxis
             leftAxis?.removeAllLimitLines()

             //         leftAxis?.addLimitLine(ll1)
             //         leftAxis?.addLimitLine(ll2)
             //         leftAxis?.axisMaximum = 200.0
             //         leftAxis?.axisMinimum = -50.0

             //        leftAxis?.axisMaximum = 100.0
             //        leftAxis?.axisMinimum = 0.0
             //
             leftAxis?.gridLineDashLengths = [5.0, 5.0]
             leftAxis?.drawZeroLineEnabled = false
             leftAxis?.drawLimitLinesBehindDataEnabled = true

             self.lineChartView.rightAxis.enabled = false
             //[_chartView.viewPortHandler setMaximumScaleY: 2.f];
             //[_chartView.viewPortHandler setMaximumScaleX: 2.f];
             */
            let marker = BalloonMarker(color: UIColor(white: 180 / 255.0, alpha: 1.0), font: UIFont.systemFont(ofSize: 12.0), textColor: UIColor.white, insets: UIEdgeInsetsMake(8.0, 8.0, 20.0, 8.0))
            marker.chartView = self.lineChartView
            marker.minimumSize = CGSize(width: 80.0, height: 40.0)
            self.lineChartView.marker = marker
            self.lineChartView.legend.form = Legend.Form(rawValue: 5)!

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

            self.setChart(months, values: unitsSold)

        }



        func setChart(_ dataPoints: [String], values: [Double]) {

            var dataEntries: [ChartDataEntry] = []

            for i in 0..<dataPoints.count {

                let dataEntry = ChartDataEntry(x:Double(i) , y: values[i])
                dataEntries.append(dataEntry)

            }
            print(dataEntries )

            let data = LineChartData()
            let ds1 = LineChartDataSet(values: dataEntries, label: "Units Sold")
            ds1.colors = [UIColor.red]
            data.addDataSet(ds1)
            self.lineChartView.data = data



        }


        func chartValueSelected(chartView: ChartViewBase, entry: ChartDataEntry, dataSetIndex: Int, highlight: Highlight) {
            //        print("\(entry.value) in \(months[dataSetIndex])")
            print(entry )
        }




    }

答案 3 :(得分:0)

import UIKit
import Charts

class ViewController: UIViewController, ChartViewDelegate {

    @IBOutlet weak var barChartView: BarChartView!
    weak var axisFormatDelegate: IAxisValueFormatter?

    var months: [String]!
    var unitsSold = [Double]()

 override func viewDidLoad() {
            super.viewDidLoad()

            barChartView.delegate = self
            axisFormatDelegate = self
            months  = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
            unitsSold  = [20.0, 54.0, 6.0, 30.0, 92.0, 16.0,114.0]
            setChart(dataPoints: months, values: unitsSold)
        } 
             func setChart(dataPoints: [String], values: [Double]) {

                barChartView.noDataText = "You need to provide data for the chart."

                // Prevent from setting an empty data set to the chart (crashes)
                guard dataPoints.count > 0 else { return }

                var dataEntries = [BarChartDataEntry]()

                for i in 0..<dataPoints.count {
                    let entry = BarChartDataEntry(x: Double(i), y: values[i], data: months as AnyObject?)
                    dataEntries.append(entry)
                }

                let chartDataSet = BarChartDataSet(entries: dataEntries, label: "Units Sold")
                chartDataSet.drawValuesEnabled = false
                chartDataSet.colors = [UIColor.red]
                chartDataSet.colors = [UIColor.lightGray]
                chartDataSet.highlightColor = UIColor.orange.withAlphaComponent(0.3)
                chartDataSet.highlightAlpha = 1
                let chartData = BarChartData(dataSet: chartDataSet)
                barChartView.data = chartData
                let xAxisValue = barChartView.xAxis
                xAxisValue.valueFormatter = axisFormatDelegate

                //   chartDataSet.colors = ChartColorTemplates.colorful()    //multiple colors

                //Animation bars
                barChartView.animate(xAxisDuration: 0.0, yAxisDuration: 1.0, easingOption: .easeInCubic)

                // X axis configurations
                barChartView.xAxis.granularityEnabled = true
                barChartView.xAxis.granularity = 1
                barChartView.xAxis.drawAxisLineEnabled = true
                barChartView.xAxis.drawGridLinesEnabled = false
                barChartView.xAxis.labelFont = UIFont.systemFont(ofSize: 15.0)
                barChartView.xAxis.labelTextColor = UIColor.black
                barChartView.xAxis.labelPosition = .bottom

                // Right axis configurations
                barChartView.rightAxis.drawAxisLineEnabled = false
                barChartView.rightAxis.drawGridLinesEnabled = false
                barChartView.rightAxis.drawLabelsEnabled = false

                // Other configurations
                barChartView.highlightPerDragEnabled = false
                barChartView.chartDescription?.text = ""
                barChartView.legend.enabled = false
                barChartView.pinchZoomEnabled = false
                barChartView.doubleTapToZoomEnabled = false
                barChartView.scaleYEnabled = false

                barChartView.drawMarkers = true

                let l = barChartView.legend
                l.horizontalAlignment = .left
                l.verticalAlignment = .bottom
                l.orientation = .horizontal
                l.drawInside = false
                l.form = .circle
                l.formSize = 9
                l.font = UIFont(name: "HelveticaNeue-Light", size: 11)!
                l.xEntrySpace = 4

                // On tapped bar marker before adding BalloonMarker.swift
                let marker =  BalloonMarker(color: UIColor.orange, font: UIFont.boldSystemFont(ofSize: 13), textColor: UIColor.white, insets: UIEdgeInsets(top: 7.0, left: 7.0, bottom: 15.0, right: 7.0))
                marker.chartView = barChartView
                barChartView.marker = marker
            }
}
    extension ViewController: IAxisValueFormatter {

        func stringForValue(_ value: Double, axis: AxisBase?) -> String {
            return months[Int(value)]
        }
    }
  1. 安装Pod文件
  2. barchartview类分配给storyboad中的图表视图
  3. 遵循setchart()方法
  4. 对于Ballon标记,请将BallonMarker.swift文件添加到此文件图表的项目库中。Demo-> Components-> BallonMarker.swift

我已经为此实现了一个演示

这将支持Swift 4.2及更高版本

检查此链接: https://github.com/vijay1864/Barchart-Demo-with-Charts-Library

此演示是在danielgindi Charts Library的帮助下制作的

https://github.com/danielgindi/Charts