美文网首页
charts 写柱状图和折线图

charts 写柱状图和折线图

作者: 糊涂0 | 来源:发表于2019-11-13 17:51 被阅读0次

绘制柱状图

    //MARK:  绘制柱状图
    
    func test4()
    {
        self.barChartView.frame = CGRect(x: 0, y: 160, width: self.view.bounds.width, height: self.view.bounds.height/2 - 64)
        self.barChartView.delegate = self
        
        self.view.addSubview(self.barChartView)
        barChartView.backgroundColor = .white
        
        //基本样式
        barChartView.noDataText = "暂无数据" //没有数据时的文字提示
        barChartView.drawValueAboveBarEnabled = true  //数值显示在柱形的上面还是下面
        barChartView.drawBarShadowEnabled = false  //是否绘制柱形的阴影背景

        
        //barChartView的交互设置
        self.barChartView.scaleYEnabled = false  //取消Y轴缩放
        self.barChartView.doubleTapToZoomEnabled = false   //取消双击缩放
        self.barChartView.dragEnabled = true  //启用拖拽图表
        self.barChartView.dragDecelerationEnabled = false  //拖拽后是否有惯性效果
        self.barChartView.dragDecelerationFrictionCoef = 0 //拖拽后惯性效果的摩擦系数(0~1),数值越小,惯性越不明显
        
        //设置barChartView的X轴样式
        let xAxis = self.barChartView.xAxis
        xAxis.axisLineWidth = 1  //设置X轴线宽
        xAxis.labelPosition = .bottom  //X轴的显示位置,默认是显示在上面的
        xAxis.drawGridLinesEnabled = true   //不绘制网格线
        
        //xAxis.l = 4  //设置label间隔,若设置为1,则如果能全部显示,则每个柱形下面都会显示label
        xAxis.labelTextColor = UIColor.init(hex: "#919191") //label文字颜色
        xAxis.labelCount = 3
        xAxis.axisLineColor = UIColor.init(hex: "#E6E6E6")
        xAxis.drawAxisLineEnabled = true
        
        self.barChartView.rightAxis.enabled = false  //不绘制右边轴
        //设置左侧Y轴的样式
        let leftAxis = self.barChartView.leftAxis
        leftAxis.forceLabelsEnabled = false   //不强制绘制制定数量的label
        //leftAxis = false  //是否只显示最大值和最小值J
        leftAxis.axisMinimum = 0.00  //设置Y轴的最小值
        leftAxis.drawZeroLineEnabled = true   //从0开始绘制
        leftAxis.axisMaximum = 2.00   //设置Y轴的最大值
        leftAxis.inverted = false   //是否将Y轴进行上下翻转
        leftAxis.axisLineWidth = 0.0    //Y轴线宽
        leftAxis.axisLineColor =  UIColor.clear  //Y轴颜色
        leftAxis.labelCount = 4
        leftAxis.forceLabelsEnabled = false
        leftAxis.drawGridLinesEnabled = true
        leftAxis.labelTextColor = UIColor.init(hex: "#919191")
        leftAxis.labelFont = UIFont.systemFont(ofSize: 11)
        
        
    
        //设置Y轴上标签的样式
        leftAxis.labelPosition = .outsideChart   //label位置
        leftAxis.labelTextColor = UIColor.init(hex: "#919191")   //文字颜色
        leftAxis.labelFont = UIFont.systemFont(ofSize: 11)  //文字字体
        
        //设置Y轴上标签显示数字的格式
//        let  leftFormatter = NumberFormatter()  //自定义格式
//        leftFormatter.positiveSuffix = " $"  //数字后缀单位
//        barChartView.leftAxis.valueFormatter = DefaultAxisValueFormatter.init(formatter: leftFormatter)
        
        //设置Y轴上网格线的样式
        leftAxis.gridLineDashLengths = [0.0, 0.0]   //设置虚线样式的网格线
        leftAxis.gridColor = UIColor.clear  //网格线颜色
        leftAxis.gridAntialiasEnabled = true   //开启抗锯齿
        
//        let limitLine = ChartLimitLine(limit: 20, label: "限制线")
//        limitLine.lineWidth = 2
//        limitLine.lineColor = UIColor.green
//        limitLine.lineDashLengths = [5.0, 5.0]   //虚线样式
//        limitLine.labelPosition = .topRight  //位置
//        leftAxis.addLimitLine(limitLine)  //添加到Y轴上
//        leftAxis.drawLimitLinesBehindDataEnabled = true  //设置限制线绘制在柱形图的后面
        
        self.barChartView.legend.enabled = false  //不显示图例说明
        self.barChartView.chartDescription?.text = "" //不显示,就设为空字符串即可
        
        
        self.setData()
    }
    
    
    func setData()
    {
        var xVals = [String]()
        for i in 0...30
        {
            xVals.append("12月\(i)日")
//            xVals.append(NSString(format: "%d年", i+1993) as String)
        }
        //chartView.xAxis.valueFormatter = KMChartAxisValueFormatter.init(xValues as NSArray)
        
        
        
        var yVals = [BarChartDataEntry]()
        for j in 0...30
        {
            let val = randomBetween(0.00, 2.00)
            yVals.append(BarChartDataEntry.init(x: Double(j), y: val))
        }
        
        //创建BarChartDataSet对象,其中包含有Y轴数据信息,以及可以设置柱形样式
        let set1 = BarChartDataSet(entries: yVals, label: "test")
        //set1.bar = 0.2  //柱形之间的间隙占整个柱形(柱形+间隙)的比例
        set1.drawValuesEnabled = false  //是否在柱形图上面显示数值
        set1.highlightEnabled = false  //点击选中柱形图是否有高亮效果,(双击空白处取消选中)
        set1.colors = [UIColor.init(hex: "#EEEEEE")]
        
        
        //将BarChartDataSet对象放入数组中
        
        
        var dataSets = [BarChartDataSet]()

        
        dataSets.append(set1)
        
        //创建BarChartData对象, 此对象就是barChartView需要最终数据对象
        
        self.barChartView.xAxis.valueFormatter = KMChartAxisValueFormatter.init(xVals as NSArray)
        
        let data:BarChartData = BarChartData(dataSets: dataSets)
        data.setValueFont(UIFont.init(name: "HelveticaNeue-Light", size: 10)!)  //文字字体
        data.setValueTextColor(UIColor.orange)  //文字颜色
        data.barWidth = 0.7
        
        //自定义数据显示格式
        let formatter = NumberFormatter()
        formatter.numberStyle = .decimal
        //formatter.positiveFormat = " $"
        self.barChartView.leftAxis.valueFormatter = DefaultAxisValueFormatter.init(formatter: formatter)
        
        
        self.barChartView.data = data
        self.barChartView.animate(xAxisDuration: 1)

    }
    
    private func randomBetween(_ firstNum: Double, _ secondNum: Double) -> Double{
        return Double(arc4random()) / Double(UINT32_MAX) * abs(firstNum - secondNum) + min(firstNum, secondNum)
    }
    
    
//       //点击选中柱形图时的代理方法
//        func chartValueSelected(_ chartView: ChartViewBase, entry: ChartDataEntry, highlight: Highlight) {
//
//    }

    //没有选中柱形图时的代理方法
    func chartValueNothingSelected(_ chartView: ChartViewBase){
     
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        
    }

    //捏合放大或缩小柱形图时的代理方法
    func chartScaled(_ chartView: ChartViewBase, scaleX: CGFloat, scaleY: CGFloat)
    {
       
    }

    //拖拽图表时的代理方法
    func chartTranslated(_ chartView: ChartViewBase, dX: CGFloat, dY: CGFloat)
    {
        
    }

绘制折线图

  func test2()
    {
        lineChartView.frame = CGRect(x: 20, y: 60, width: self.view.bounds.width - 40, height: 200)
        self.view.addSubview(lineChartView)
        lineChartView.delegate = self
        
        lineChartView.backgroundColor = .white
        lineChartView.noDataText = "暂无数据"
        
        //设置交互样式
        lineChartView.scaleYEnabled = false //取消Y轴缩放
        lineChartView.doubleTapToZoomEnabled = true //双击缩放
        lineChartView.dragEnabled = true //启用拖动手势
        lineChartView.dragDecelerationEnabled = true //拖拽后是否有惯性效果
        lineChartView.dragDecelerationFrictionCoef = 0.9  //拖拽后惯性效果的摩擦系数(0~1),数值越小,惯性越不明显
        
        //设置X轴样式
        let xAxis = lineChartView.xAxis
        xAxis.axisLineWidth = 1.0/UIScreen.main.scale //设置X轴线宽
        xAxis.labelPosition = .bottom //X轴的显示位置,默认是显示在上面的
        xAxis.drawGridLinesEnabled = false;//不绘制网格线
        xAxis.spaceMin = 4;//设置label间隔
        xAxis.axisMinimum = 0
        xAxis.labelTextColor = UIColor.blue//label文字颜色
        
        //设置Y轴样式
        lineChartView.rightAxis.enabled = false  //不绘制右边轴
        let leftAxis = lineChartView.leftAxis
        leftAxis.labelCount = 4 //Y轴label数量,数值不一定,如果forceLabelsEnabled等于YES, 则强制绘制制定数量的label, 但是可能不平均
        leftAxis.forceLabelsEnabled = true //不强制绘制指定数量的label
        leftAxis.axisMinimum = 0 //设置Y轴的最小值
        leftAxis.drawZeroLineEnabled = true //从0开始绘制
        //leftAxis.axisMaximum = 1000 //设置Y轴的最大值
        leftAxis.inverted = false //是否将Y轴进行上下翻转
        leftAxis.axisLineWidth = 0.0 //设置Y轴线宽
        leftAxis.axisLineColor = UIColor.clear//Y轴颜色
        //leftAxis.valueFormatter = NumberFormatter()//自定义格式
        //leftAxis.s  //数字后缀单位
        leftAxis.labelPosition = .outsideChart//label位置
        leftAxis.labelTextColor = UIColor.init(hex: "#919191")//文字颜色
        leftAxis.labelFont = UIFont.systemFont(ofSize: 11)//文字字体
        
        
        //设置网格样式
        leftAxis.gridLineDashLengths = [3.0,3.0]  //设置虚线样式的网格线
        leftAxis.gridColor = UIColor.init(hex: "#E6E6E6") //网格线颜色
        leftAxis.gridAntialiasEnabled = true //开启抗锯齿
        
        
//        //添加限制线
//        let litmitLine = ChartLimitLine(limit: 260, label: "限制线")
//        litmitLine.lineWidth = 2
//        litmitLine.lineColor = UIColor.green
//        litmitLine.lineDashLengths = [5.0,5.0] //虚线样式
//        litmitLine.labelPosition = .topRight
//        litmitLine.valueTextColor = UIColor.brown
//        litmitLine.valueFont = UIFont.systemFont(ofSize: 12)
//        leftAxis.addLimitLine(litmitLine)
//        leftAxis.drawLimitLinesBehindDataEnabled = true  //设置限制线绘制在折线图的后面
        
//        //设置折线图描述及图例样式
//        lineChartView.chartDescription?.text = "" //折线图描述
//        lineChartView.chartDescription?.textColor = UIColor.cyan  //描述字体颜色
//        lineChartView.legend.form = .line  // 图例的样式
//        lineChartView.legend.formSize = 20  //图例中线条的长度
//        lineChartView.legend.textColor = UIColor.darkGray
        
        
        //设置折线图的数据
        let xValues = ["x1","x2","x3","x4","x5","x6","x7","x8","x9","x10","x11","x12","x13","x14","x15","x16","x17","x18","x19","x20","x21","x22","x23","x24","x25","x26"]
        lineChartView.xAxis.valueFormatter = KMChartAxisValueFormatter.init(xValues as NSArray)
        //ineChartView.xAxis.labelCount = 12
        //lineChartView.leftAxis.valueFormatter = KMChartAxisValueFormatter.init()
        //在这里如果不需要自定义x轴的数据格式,可以使用原生的格式如下:
        //`lineChartView.xAxis.valueFormatter = IndexAxisValueFormatter.init(values: xValues)`
        let leftValueFormatter = NumberFormatter()  //自定义格式
        leftValueFormatter.positiveSuffix = "%"  //数字后缀单位
        
        lineChartView.leftAxis.valueFormatter = DefaultAxisValueFormatter.init(formatter: leftValueFormatter)
        lineChartView.legend.form = .none
        
//        var yDataArray1 = [ChartDataEntry]()
//        for i in 0...xValues.count-1 {
//            let y = arc4random()%500
//            let entry = ChartDataEntry.init(x: Double(i), y: Double(y))
//
//            yDataArray1.append(entry)
//        }
        
        
        var yDataArray1 = [ChartDataEntry]()
        for i in 0...xValues.count-1 {
            let y = arc4random()%500
            let entry = ChartDataEntry.init(x: Double(i), y: Double(y))
            
            yDataArray1.append(entry)
        }
                
    
        let set1 = LineChartDataSet.init(entries: yDataArray1, label: "")
        set1.drawCirclesEnabled = false //是否绘制转折点
        set1.colors = [UIColor.init(hex: "#007EFF")]
        set1.lineWidth = 1
        set1.mode = .linear  //设置曲线是否平滑
        set1.drawFilledEnabled = true
        set1.fillColor = UIColor.init(hex: "#DFEFFF")
        set1.fillAlpha = 0.5
//
//        var yDataArray2 = [ChartDataEntry]();
//        for i in 0...(xValues.count-1) {
//            let y = arc4random()%500+1
//            let entry = ChartDataEntry.init(x: Double(i), y: Double(y))
//
//            yDataArray2.append(entry);
//        }
//        let set2 = LineChartDataSet.init(entries: yDataArray2, label: "test1")
//        set2.colors = [UIColor.green]
//        set2.drawCirclesEnabled = false
//        set2.lineWidth = 1.0
        
        let data = LineChartData.init(dataSets: [set1])
        
        lineChartView.data = data
        //lineChartView.animate(xAxisDuration: 1.0, yAxisDuration: 1.0, easingOption: .easeInBack)
        lineChartView.animate(xAxisDuration: 1)  //设置动画时间
        
    }
    
    func showMarkerView(value:String)
    {
        let marker = MarkerView.init(frame: CGRect(x: 20, y: 20, width: 60, height: 20))
        marker.chartView = self.lineChartView
        let label = UILabel(frame: CGRect(x: 0, y: 0, width: 60, height: 20))
        label.text = value
        label.textColor = UIColor.white
        label.font = UIFont.systemFont(ofSize: 12)
        label.backgroundColor = UIColor.gray
        label.textAlignment = .center
        marker.addSubview(label)
        self.lineChartView.marker = marker
    }
    
    
    // 点击选中柱形图时的代理方法   点击选中折线图时的代理方法
    func chartValueSelected(_ chartView: ChartViewBase, entry: ChartDataEntry, highlight: Highlight)
    {
        if self.lineChartView.frame.size.height > 0
        {
            self.showMarkerView(value: "\(entry.y)")
        }
        
  
    }

相关文章

网友评论

      本文标题:charts 写柱状图和折线图

      本文链接:https://www.haomeiwen.com/subject/hqdkictx.html