iOS-Charts图库引用及使用

Charts可以绘制柱状图、折线图、K线图、饼状图等Charts,且和Android一致的图表界面MPAndroidChart。 Charts是一套非常漂亮的开源图表组件,它是MPAndroidChart在苹果端的移植版本,同时支持iOS/tvOS/OSX平台。 Charts是用 Swift语言编写的,能够同时在 Swift 和 Objc 工程中使用。

核心功能:
支持8种不同的图表类型
1、支持两轴缩放(支持触摸手势,两轴单独或同时的放缩)
2、支持使用触摸手势进行 拖拽/平移。
3、组合图表(线状,柱状,散点图,蜡烛图,气泡图等)
4、多个(或单独)的轴
5、可自定义坐标轴 (包括x 轴和 y 轴)
6、高亮显示值(支持自定义popup-view来显示选中的值)
7、可保存图表到 Camera-roll, 支持导出为 PNG 和 JPEG格式
8、预定义的颜色模板
9、图例(可自动生成,或者自定义)
9、动画(支持在x和y轴上建立动画)
10、限制线(用来提供附加信息,最大值...)
11、完全自定义(paints,字体,图例,颜色,背景,手势,虚线)

图表类型示例:
LineChart -(线状图、渐变填充)
Combined-Chart - 组合图表(下图为线状图和柱状图)
BarChart - (柱状图、多个数据集)
Horizontal-BarChart(水平方向的柱状图)
PieChart - (饼图)
ScatterChart - 散点图(带正方形,三角形,圆形,等等)
CandleStickChart - 蜡烛图(用于财务数据)
BubbleChart - 气泡图(气泡覆盖的区域表示该值)
RadarChart - 雷达图(蜘蛛网图)

一、Charts库Objc引用(默认cocoapods导入)

1.1、配置好Swift桥接文件。
创建桥接文件.png

1.2、引入Charts。 @import Charts;
引入Charts.png
这样就可以使用Charts库了。
1.2、我是全局引用这个桥接文件的
#import "KLineProject-Bridging-Header.h" //在pch文件全局引入吧,方便

二、使用

2.0、折线/曲线图的绘制示例-LineChart- (线状图、渐变填充)
#import "LineChartsController.h"

@interface LineChartsController ()<ChartViewDelegate,IChartAxisValueFormatter>
@property (nonatomic ,strong)LineChartView *chartView;
@property (nonatomic ,strong)NSArray *xTitle;

@end
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    self.navigationItem.title = @"折线图1";
    self.view.backgroundColor = [UIColor whiteColor];
    [self.view addSubview:self.chartView];
    [self setData:@[@59,@77,@23,@38,@90,@20]];
    [self setData:@[@33,@12,@80,@44]];
    
}
- (LineChartView *)chartView{
    if (_chartView == nil) {
        _chartView = [[LineChartView alloc]init];
        _chartView.frame = CGRectMake(0, 80, self.view.frame.size.width-10, 300);
        _chartView.noDataText = @"暂无数据";
        _chartView.scaleYEnabled = NO;//设置交互方式
        _chartView.dragDecelerationEnabled = YES;//启动拖拽图标
        _chartView.dragDecelerationFrictionCoef = 0.9;//拖拽后是否有惯性效果(0~1),数值越小,惯性越不明显
        ChartXAxis *xAxis = _chartView.xAxis; // 设置 X 轴样式
        xAxis.labelPosition = XAxisLabelPositionBottom;// 设置 X 轴的显示位置,默认是显示在上面的
        xAxis.axisLineWidth = 1.0/[UIScreen mainScreen].scale;// 设置 X 轴线宽
        xAxis.axisLineColor = [UIColor blackColor];
        xAxis.granularityEnabled = YES;// 设置重复的值不显示
        xAxis.valueFormatter = self; // label 文字样式,自定义格式,默认时不显示特殊符号
        xAxis.labelTextColor = [UIColor blackColor];// label 文字颜色
        xAxis.drawGridLinesEnabled = NO;// // 不绘制网格线
        xAxis.axisMinimum = -0.4;
        _chartView.rightAxis.enabled = NO;// 设置 Y 轴样式不绘制右边轴
        ChartYAxis *leftAxis = _chartView.leftAxis;// 获取左边 Y 轴
        leftAxis.inverted = NO; // 是否将 Y 轴进行上下翻转
        leftAxis.axisLineWidth = 1.0/[UIScreen mainScreen].scale;// 设置 Y 轴线宽
        leftAxis.axisLineColor = [UIColor orangeColor];// 设置 Y 轴颜色
        leftAxis.labelPosition = YAxisLabelPositionOutsideChart;// label 文字位置 YAxisLabelPositionInsideChart:在里面,YAxisLabelPositionOutsideChart:在外面
        leftAxis.labelTextColor = [UIColor blackColor]; // label 文字颜色
        leftAxis.labelFont = [UIFont systemFontOfSize:10.0f]; // 不强制绘制指定数量的 label
        leftAxis.forceLabelsEnabled = NO; // 不强制绘制指定数量的 label
        leftAxis.gridLineDashLengths = @[@3.0f,@3.0f];// 设置虚线样式的网格线 网格线的大小
        leftAxis.gridColor = [UIColor redColor]; // 网格线颜色
        leftAxis.gridAntialiasEnabled = YES;// 网格线开启抗锯齿
        _chartView.chartDescription.enabled = NO;// 设置折线图描述
        _chartView.legend.enabled = NO; // 设置折线图图例
        [_chartView animateWithXAxisDuration:1.0f];// 设置动画效果,可以设置 X 轴和 Y 轴的动画效果
    }
    return _chartView;
}

#pragma mark -
- (NSString *)stringForValue:(double)value axis:(ChartAxisBase *)axis{
    //    return self.xTitle[(NSInteger)value];
    return [NSString stringWithFormat:@"11"];//x轴数据
}
- (void)setData:(NSArray *)dataArr{
    ChartXAxis *xAxis = _chartView.xAxis;
    xAxis.axisMinimum = self.xTitle.count-0.5;
    NSMutableArray *valueArray = [NSMutableArray array];
    [valueArray addObject:dataArr];
    NSMutableArray *dataSets = [NSMutableArray array];
    double leftAxisMin = 0;
    double leftAxisMax = 0;
    for (int i = 0; i<valueArray.count; i++) {
        NSArray *values = valueArray[i];
        NSMutableArray *yVals = [NSMutableArray array];
        for (int j = 0; j<values.count; j++) {
            NSString *valStr = [NSString stringWithFormat:@"%@",values[j]];
            double val = [valStr doubleValue];
            leftAxisMax = MAX(val, leftAxisMax);
            leftAxisMin = MIN(val, leftAxisMax);
            ChartDataEntry *entry = [[ChartDataEntry alloc]initWithX:j y:val];
            [yVals addObject:entry];
        }
        [_chartView setVisibleXRangeWithMinXRange:1 maxXRange:4];
        LineChartDataSet * dataSet = [[LineChartDataSet alloc]initWithEntries:yVals];
        dataSet.lineWidth = 2.0f;//折线宽度
        dataSet.drawValuesEnabled = YES;//是否在拐点处显示数据
        dataSet.valueColors = @[[UIColor orangeColor],[UIColor redColor]];//折线拐点处显示数据的颜色
        dataSet.drawCirclesEnabled = NO;//是否开启绘制阶梯样式的折线图
        dataSet.cubicIntensity = 0.2;// 曲线弧度
        dataSet.circleRadius = 3.0f;//拐点半径
        dataSet.mode = LineChartModeCubicBezier;// 模式为曲线模式
        dataSet.axisDependency = AxisDependencyLeft;
        dataSet.circleHoleRadius = 2.0f;//空心的半径
        dataSet.circleColors = @[[UIColor blueColor]];//空心的圈的颜色
        dataSet.circleHoleColor = [UIColor grayColor];//空心的颜色
        dataSet.highlightEnabled = YES;//选中拐点,是否开启高亮效果(显示十字线)
        dataSet.highlightColor = [UIColor clearColor];
        dataSet.valueFont = [UIFont systemFontOfSize:12];
        dataSet.drawFilledEnabled = YES;//是否填充颜色
        // 设置渐变效果
        [dataSet setColor:[UIColor colorWithRed:0.114 green:0.812 blue:1.0 alpha:1.0]];//折线颜色
        NSArray *gradientColors = @[(id)[ChartColorTemplates colorFromString:@"#FFFFFFFF"].CGColor,(id)[ChartColorTemplates colorFromString:@"#C4F3FF"].CGColor];
        CGGradientRef gradientRef = CGGradientCreateWithColors(nil, (CFArrayRef)gradientColors, nil);
        dataSet.fillAlpha = 1.0f;//透明度
        dataSet.fill = [ChartFill fillWithLinearGradient:gradientRef angle:90.0f];//赋值填充颜色对象
        CGGradientRelease(gradientRef);//释放gradientRef
        // 把线放到LineChartData里面,因为只有一条线,所以集合里面放一个就好了,多条线就需要不同的 set 啦
        
        [dataSets addObject:dataSet];
    }
    double leftDiff = leftAxisMax - leftAxisMin;
    if (leftAxisMax == 0 && leftAxisMin == 0) {
        leftAxisMax = 100.0;
        leftAxisMin = 0;
    } else {
        leftAxisMax = (leftAxisMax + leftDiff * 0.2);
        leftAxisMin = (leftAxisMin - leftDiff * 0.1);
    }
    NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
    numberFormatter.numberStyle = NSNumberFormatterDecimalStyle;
    numberFormatter.multiplier   = @0.001;
    numberFormatter.positiveSuffix = @"K";
    self.chartView.leftAxis.valueFormatter = [[ChartDefaultAxisValueFormatter alloc]initWithFormatter:numberFormatter];
    self.chartView.leftAxis.axisMinimum = 0;//设置Y轴的最小值
    self.chartView.leftAxis.axisMaximum = leftAxisMax;//设置Y轴的最大值
    LineChartData *data = [[LineChartData alloc] initWithDataSets:dataSets];
    self.chartView.data = data;
    NSNumberFormatter *pFormatter = [[NSNumberFormatter alloc] init];
    pFormatter.numberStyle = NSNumberFormatterDecimalStyle;
    pFormatter.maximumFractionDigits = 2; // 小数位数(销量小数位0)
    [data setValueFormatter:[[ChartDefaultValueFormatter alloc] initWithFormatter:pFormatter]];
    [self.chartView animateWithYAxisDuration:0.3f];
}

效果如下图


折线图的绘制.png
2.1、 饼状图的绘制示例-PieChart - (饼图)
#import "PieChartsController.h"

@interface PieChartsController ()
@property (nonatomic ,strong)PieChartView *pieChartView;

@end
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    self.view.backgroundColor =[UIColor whiteColor];
    
    _pieChartView = [[PieChartView alloc] initWithFrame:CGRectZero];
    _pieChartView.backgroundColor = [UIColor whiteColor];
    [self.view addSubview:self.pieChartView];
    self.pieChartView.frame = CGRectMake(0, 64, self.view.frame.size.width, self.view.frame.size.height -64);
//-------------------- 饼状图的配置----------------------
//     动画
    [self.pieChartView animateWithXAxisDuration:1];
    [self.pieChartView animateWithYAxisDuration:1];
//     饼状图距离边缘的间隙
    [_pieChartView setExtraOffsetsWithLeft:35 top:10 right:35 bottom:10];
//     是否根据所提供的数据, 将显示数据转换为百分比格式
    _pieChartView.usePercentValuesEnabled = NO;
//     拖拽饼状图后是否有惯性效果
    _pieChartView.dragDecelerationEnabled = YES;
//     是否显示区块文本
    _pieChartView.drawCenterTextEnabled = NO;
//     饼状图是否是空心
    _pieChartView.drawHoleEnabled = YES;
//     空心半径占比
    _pieChartView.holeRadiusPercent = 0.5;
//     空心颜色
    _pieChartView.holeColor = [UIColor clearColor];
//     半透明空心半径占比
    _pieChartView.transparentCircleRadiusPercent = 0.52;
//     半透明空心的颜色
    _pieChartView.transparentCircleColor = [UIColor colorWithRed:210/255.0 green:145/255.0 blue:165/255.0 alpha:0.3];
//      设置空心文字
    if (_pieChartView.isDrawHoleEnabled == YES) {
//     是否显示中间文字
        _pieChartView.drawCenterTextEnabled = YES;
//      普通文本
//     中间文字
        _pieChartView.centerText = @"大饼";
//      富文本
        NSMutableAttributedString *centerText = [[NSMutableAttributedString alloc] initWithString:@"饼状图"];
        [centerText setAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:18],NSForegroundColorAttributeName:[UIColor orangeColor]} range:NSMakeRange(0, centerText.length)];
        _pieChartView.centerAttributedText = centerText;
    }
//       设置饼状图描述
//      是否开启描述label
    _pieChartView.chartDescription.enabled = NO;
//    -------------------------legend图例的属性配置-------------------------------
//     是否开启图例
    _pieChartView.legend.enabled = NO;
//     图例在饼状图中的大小占比, 这会影响图例的宽高
    _pieChartView.legend.maxSizePercent = 1;
//      文本间隔
    _pieChartView.legend.formToTextSpace = 5;
//       图例间隔大小
    _pieChartView.legend.yEntrySpace = 5;//10;
//       字体大小
    _pieChartView.legend.font = [UIFont systemFontOfSize:20];
//      字体颜色
    _pieChartView.legend.textColor = [UIColor grayColor];
//       图例在饼状图中的位置
//        图示样式: 方形、线条、圆形
    _pieChartView.legend.form = ChartLegendFormSquare;
//        图示大小
    _pieChartView.legend.formSize =10;
//    ------------------------饼状图的数据配置----------------------
//       每个区块的金额数
    NSMutableArray* moneyArray =[NSMutableArray arrayWithArray:@[@10,@20,@30,@40,@50]];

//      每个区块的颜色
    NSMutableArray *colors = [[NSMutableArray alloc] init];
    [colors addObject:[UIColor colorWithRed:141/255.f green:116/255.f blue:244/255.f alpha:1]];
    [colors addObject:[UIColor colorWithRed:245/255.f green:101/255.f blue:103/255.f alpha:1]];
    [colors addObject:[UIColor orangeColor]];
    [colors addObject:[UIColor greenColor]];
    [colors addObject:[UIColor redColor]];
    // 每个区块的数据
    NSMutableArray *yVals = [[NSMutableArray alloc] init];
    for(int i =0; i < moneyArray.count; i++) {
        double randomVal = [moneyArray[i] doubleValue];
        BarChartDataEntry *entry = [[BarChartDataEntry alloc] initWithX:i y:randomVal];
        [yVals addObject:entry];
    }
//    PieChartDataSet *dataSet = [[PieChartDataSet alloc] initWithValues:yVals label:@""];
    PieChartDataSet * dataSet =[[PieChartDataSet alloc]initWithEntries:yVals label:@""];
//     是否绘制显示数据
    dataSet.drawValuesEnabled = YES;
//     区块颜色
    dataSet.colors= colors;
//     相邻区块之间的间距
    dataSet.sliceSpace=0;
//     选中区块时, 放大的半径
    dataSet.selectionShift=12;
//     名称位置
    dataSet.xValuePosition = PieChartValuePositionInsideSlice;
//     数据位置
//     数据与区块之间的用于指示的折线样式
    dataSet.yValuePosition = PieChartValuePositionOutsideSlice;
//     折线中第一段起始位置相对于区块的偏移量, 数值越大, 折线距离区块越远
    dataSet.valueLinePart1OffsetPercentage = 0.85;
//     折线中第一段长度占比
    dataSet.valueLinePart1Length = 0.4;
//     折线中第二段长度最大占比
    dataSet.valueLinePart2Length = 0.6;
//     折线的粗细
    dataSet.valueLineWidth=1.0;
//     折线颜色
    dataSet.valueLineColor= [UIColor redColor];
    dataSet.valueLineVariableLength = YES;
    dataSet.valueTextColor= [UIColor blackColor];
    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    formatter.numberStyle = NSNumberFormatterPercentStyle;//NSNumberFormatterPercentStyle;
    [formatter setPositiveFormat:@"###,##0.00;"];
//     小数位数
    formatter.maximumFractionDigits = 2;
    formatter.multiplier=@1.f;
    formatter.paddingPosition = NSNumberFormatterPadBeforeSuffix;
//     数据设置上去
    PieChartData *data = [[PieChartData alloc] initWithDataSet:dataSet];
    _pieChartView.data = data;

}

饼状图预览


饼状图预览.png

其他的图形类似,就不重复了,代码已上传git,可以去下载。本文代码git地址

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

推荐阅读更多精彩内容