iOS 使用Charts绘制图表(Swift版)

Charts一款绘制图表的框架:可以绘制多种类型的图表;通过手势进行两个轴的缩放和拖拽等等,只要记住支持全方位自定义就行了,开始正文

准备工作

使用Pod导入Charts

platform :ios, '8.0'
use_frameworks!

def pods
    pod 'Charts', '~> 3.0'
end
target 'chartsDemo' do
    pods
end

一、折线图LineChartView

时间问题只能先搞个折线图,写的比较粗糙将就看吧,后面还有个饼状图O(∩_∩)O~

lineChartView.png
初始化LineChartView

懒加载:取消双击缩放和拖拽 隐藏右边Y轴,设置左边Y轴...

lazy var lineChartView:LineChartView = {
        let _lineChartView = LineChartView.init(frame: CGRect.init(x: 0, y: 20, width: 300, height: 300));
        _lineChartView.delegate = self;//
        _lineChartView.backgroundColor = UIColor.init(red: 230/255.0, green: 253/255.0, blue: 253/255.0, alpha: 1.0);
        _lineChartView.doubleTapToZoomEnabled = false;
        _lineChartView.scaleXEnabled = false;
        _lineChartView.scaleYEnabled = false;
        _lineChartView.chartDescription?.text = "";//设置为""隐藏描述文字
        
        _lineChartView.noDataText = "暂无数据";
        _lineChartView.noDataTextColor = UIColor.gray;
        _lineChartView.noDataFont = UIFont.boldSystemFont(ofSize: 14);
        
        //y轴
        _lineChartView.rightAxis.enabled = false;
        let leftAxis = _lineChartView.leftAxis;
        leftAxis.labelCount = 10;
        leftAxis.forceLabelsEnabled = false;
        leftAxis.axisLineColor = UIColor.black;
        leftAxis.labelTextColor = UIColor.black;
        leftAxis.labelFont = UIFont.systemFont(ofSize: 10);
        leftAxis.labelPosition = .outsideChart;
        leftAxis.gridColor = UIColor.init(red: 233/255.0, green: 233/255.0, blue: 233/255.0, alpha: 1.0);//网格
        leftAxis.gridAntialiasEnabled = false;//抗锯齿
        leftAxis.axisMaximum = 500;//最大值
        leftAxis.axisMinimum = 0;
        leftAxis.labelCount = 11;//多少等分
        
        //x轴
        let xAxis = _lineChartView.xAxis;
        xAxis.granularityEnabled = true;
        xAxis.labelTextColor = UIColor.black;
        xAxis.labelFont = UIFont.systemFont(ofSize: 10.0);
        xAxis.labelPosition = .bottom;
        xAxis.gridColor = UIColor.init(red: 233/255.0, green: 233/255.0, blue: 233/255.0, alpha: 1.0);
        xAxis.axisLineColor = UIColor.black;
        xAxis.labelCount = 12;
        return _lineChartView;
    }()
填充数据
func drawLineChart(){
        self.addLimitLine(250, "限制线");
        let xValues = ["x1","x2","x3","x4","x5","x6","x7","x8","x9","x10","x11","x12"];
        lineChartView.xAxis.valueFormatter = VDChartAxisValueFormatter.init(xValues as NSArray);
        lineChartView.leftAxis.valueFormatter = VDChartAxisValueFormatter.init();
        
        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(values: yDataArray1, label: "橙色");
        set1.colors = [UIColor.orange];
        set1.drawCirclesEnabled = false;//绘制转折点
        set1.lineWidth = 1.0;
        
        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(values: yDataArray2, label: "绿色");
        set2.colors = [UIColor.green];
        set2.drawCirclesEnabled = false;
        set2.lineWidth = 1.0;
        
        let data = LineChartData.init(dataSets: [set1,set2]);
        
        lineChartView.data = data;
        lineChartView.animate(xAxisDuration: 1.0, yAxisDuration: 1.0, easingOption: .easeInBack);
    }
valueFormatter设置说明

自定义formatter继承协议ChartViewDelegate

import UIKit
import Charts
class VDChartAxisValueFormatter: NSObject,IAxisValueFormatter {
    var values:NSArray?;
    override init() {
        super.init();
    }
    init(_ values: NSArray) {
        super.init();
        self.values = values;
    }
    func stringForValue(_ value: Double, axis: AxisBase?) -> String {
        if values == nil {
            return "\(value)";
        }
        return values?.object(at: Int(value)) as! String;
    }
}

其它设置说明
设置限制线
func addLimitLine(_ value:Double, _ desc:String) {
        let limitLine = ChartLimitLine.init(limit: value, label: desc);
        //线
        limitLine.lineWidth = 1;
        limitLine.lineColor = UIColor.red;
        limitLine.lineDashLengths = [2.0,2.0];
        //文字
        limitLine.valueFont = UIFont.systemFont(ofSize: 10.0);
        limitLine.valueTextColor = UIColor.black;
        limitLine.labelPosition = .rightBottom;
        lineChartView.leftAxis.addLimitLine(limitLine);
    }
设置MarkerView:点击拐点显示基本信息

自定义MarkerView

func showMarkerView(_ value: String) {
        let marker = MarkerView.init(frame: CGRect.init(x: 20, y: 20, width: 60, height: 20));
        marker.chartView = lineChartView;
        let label = UILabel.init(frame: CGRect.init(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);
        lineChartView.marker = marker;
        
    }

实现代理方法chartValueSelected(_ chartView: ChartViewBase, entry: ChartDataEntry, highlight: Highlight),显示marker

func chartValueSelected(_ chartView: ChartViewBase, entry: ChartDataEntry, highlight: Highlight) {
        self.showMarkerView("\(entry.y)");
    }

二、饼状图PieChartView

可能是颜色搭配问题画的图不好看,不过主要还是实现 let's go!

PieChartView.png
初始化PieChartView

懒加载:都是一些基本设置注释很详细自己看喽,主要设置自动转百分比(百分号需要自己加,后面会有说明)、空心设置和图例显示设置

lazy var pieChartView: PieChartView = {
        let _pieChartView = PieChartView.init(frame: CGRect.init(x: 0, y: 20, width: 340, height: 340));
        _pieChartView.backgroundColor = UIColor.init(red: 230/255.0, green: 253/255.0, blue: 253/255.0, alpha: 1.0);
        _pieChartView.setExtraOffsets(left: 40, top: 10, right: 40, bottom: 30);//设置这块饼的位置
        _pieChartView.chartDescription?.text = "饼状图示例";//描述文字
        _pieChartView.chartDescription?.font = UIFont.systemFont(ofSize: 12.0);//字体
        _pieChartView.chartDescription?.textColor = UIColor.black;//颜色
        
        _pieChartView.usePercentValuesEnabled = true;//转化为百分比
        _pieChartView.dragDecelerationEnabled = false;//我把拖拽效果关了
        _pieChartView.drawEntryLabelsEnabled = true;//显示区块文本
        _pieChartView.entryLabelFont = UIFont.systemFont(ofSize: 10);//区块文本的字体
        _pieChartView.entryLabelColor = UIColor.white;
        _pieChartView.drawSlicesUnderHoleEnabled = true;
        
        
        _pieChartView.drawHoleEnabled = true;//这个饼是空心的
        _pieChartView.holeRadiusPercent = 0.382//空心半径黄金比例
        _pieChartView.holeColor = UIColor.white;//空心颜色设置为白色
        _pieChartView.transparentCircleRadiusPercent = 0.5;//半透明空心半径
        
        _pieChartView.drawCenterTextEnabled = true;//显示中心文本
        _pieChartView.centerText = "饼状图";//设置中心文本,你也可以设置富文本`centerAttributedText`
        
        //图例样式设置
        _pieChartView.legend.maxSizePercent = 1;//图例的占比
        _pieChartView.legend.form = .circle//图示:原、方、线
        _pieChartView.legend.formSize = 8;//图示大小
        _pieChartView.legend.formToTextSpace = 4;//文本间隔
        _pieChartView.legend.font = UIFont.systemFont(ofSize: 8);
        _pieChartView.legend.textColor = UIColor.gray;
        _pieChartView.legend.horizontalAlignment = .left;
        _pieChartView.legend.verticalAlignment = .top;
        
        _pieChartView.animate(xAxisDuration: 1.0, yAxisDuration: 1.0, easingOption: .easeInBack);
        
        return _pieChartView;
    }()
填充数据开始画饼
单独讲
  • 需要两组数据:标题或者描述 和 数据
  • 设置指示折线时记住将标题和数据位置分离(注释有写的)
  • 代码data.setValueFormatter(VDChartAxisValueFormatter.init())中的VDChartAxisValueFormatter需要继承代理IValueFormatter然后实现代理方法
func stringForValue(_ value: Double, entry: ChartDataEntry, dataSetIndex: Int, viewPortHandler: ViewPortHandler?) -> String {
        return String.init(format: "%.2f%%", value);
    }
开画
func drawPieChartView() {
        let titles = ["红","黄","蓝色","橙","绿"];
        let yData = [20,30,10,40,60];
        var yVals = [PieChartDataEntry]();
        for i in 0...titles.count-1 {
            let entry = PieChartDataEntry.init(value: Double(yData[i]), label: titles[i]);
            yVals.append(entry);
        }
        
        let dataSet = PieChartDataSet.init(values: yVals, label: "");
        dataSet.colors = [UIColor.red,UIColor.yellow,UIColor.blue,UIColor.orange,UIColor.green];
        //设置名称和数据的位置 都在内就没有折线了哦
        dataSet.xValuePosition = .insideSlice;
        dataSet.yValuePosition = .outsideSlice;
        dataSet.sliceSpace = 1;//相邻块的距离
        dataSet.selectionShift = 6.66;//选中放大半径
        //指示折线样式
        dataSet.valueLinePart1OffsetPercentage = 0.8 //折线中第一段起始位置相对于区块的偏移量, 数值越大, 折线距离区块越远
        dataSet.valueLinePart1Length = 0.8 //折线中第一段长度占比
        dataSet.valueLinePart2Length = 0.4 //折线中第二段长度最大占比
        dataSet.valueLineWidth = 1 //折线的粗细
        dataSet.valueLineColor = UIColor.brown //折线颜色
        
        let data = PieChartData.init(dataSets: [dataSet]);
        data.setValueFormatter(VDChartAxisValueFormatter.init());//格式化值(添加个%)
        data.setValueFont(UIFont.systemFont(ofSize: 10.0));
        data.setValueTextColor(UIColor.lightGray);
        pieChartView.data = data;
        
    }

本人比较懒喜欢直接上代码,当一个快速笔记看吧,有问题欢迎指出😄

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容