美文网首页项目经验iOS资料iOS_小蟹专题
iOS使用Charts框架绘制—饼状图

iOS使用Charts框架绘制—饼状图

作者: jianshu_wl | 来源:发表于2016-06-16 14:50 被阅读16570次

首先先看一下效果:

饼状图

一、创建饼状图对象

创建饼状图对象用到类是PieChartView.h, 代码如下:

self.pieChartView = [[PieChartView alloc] init];
self.pieChartView.backgroundColor = BgColor;
[self.view addSubview:self.pieChartView];
[self.pieChartView mas_makeConstraints:^(MASConstraintMaker *make) {
      make.size.mas_equalTo(CGSizeMake(300, 300));
      make.center.mas_equalTo(self.view);
}];

二、设置饼状图外观样式

1. 基本样式
[self.pieChartView setExtraOffsetsWithLeft:30 top:0 right:30 bottom:0];//饼状图距离边缘的间隙
self.pieChartView.usePercentValuesEnabled = YES;//是否根据所提供的数据, 将显示数据转换为百分比格式
self.pieChartView.dragDecelerationEnabled = YES;//拖拽饼状图后是否有惯性效果
self.pieChartView.drawSliceTextEnabled = YES;//是否显示区块文本
2. 设置饼状图中间的空心样式

空心有两个圆组成, 一个是hole, 一个是transparentCircle, transparentCircle里面是hole, 所以饼状图中间的空心也就是一个同心圆. 代码如下:

self.pieChartView.drawHoleEnabled = YES;//饼状图是否是空心
self.pieChartView.holeRadiusPercent = 0.5;//空心半径占比
self.pieChartView.holeColor = [UIColor clearColor];//空心颜色
self.pieChartView.transparentCircleRadiusPercent = 0.52;//半透明空心半径占比
self.pieChartView.transparentCircleColor = [UIColor colorWithRed:210/255.0 green:145/255.0 blue:165/255.0 alpha:0.3];//半透明空心的颜色
3. 设置饼状图中心的文本

当饼状图是空心样式时, 可以在饼状图中心添加文本, 添加文本有两种方法. 一种方法是使用centerText 属性添加, 这种方法不能设置字体颜色、大小等. 另一种方法是使用centerAttributedText属性添加, 这种方法添加的富文本, 因此就可以对字体进行进一步美化了. 代码如下:

if (self.pieChartView.isDrawHoleEnabled == YES) {
        self.pieChartView.drawCenterTextEnabled = YES;//是否显示中间文字
        //普通文本
//        self.pieChartView.centerText = @"饼状图";//中间文字
        //富文本
        NSMutableAttributedString *centerText = [[NSMutableAttributedString alloc] initWithString:@"饼状图"];
        [centerText setAttributes:@{NSFontAttributeName: [UIFont boldSystemFontOfSize:16],
                                    NSForegroundColorAttributeName: [UIColor orangeColor]}
                            range:NSMakeRange(0, centerText.length)];
        self.pieChartView.centerAttributedText = centerText;
}
4. 设置饼状图描述
self.pieChartView.descriptionText = @"饼状图示例";
self.pieChartView.descriptionFont = [UIFont systemFontOfSize:10];
self.pieChartView.descriptionTextColor = [UIColor grayColor];
6. 设置饼状图图例样式
self.pieChartView.legend.maxSizePercent = 1;//图例在饼状图中的大小占比, 这会影响图例的宽高
self.pieChartView.legend.formToTextSpace = 5;//文本间隔
self.pieChartView.legend.font = [UIFont systemFontOfSize:10];//字体大小
self.pieChartView.legend.textColor = [UIColor grayColor];//字体颜色
self.pieChartView.legend.position = ChartLegendPositionBelowChartCenter;//图例在饼状图中的位置
self.pieChartView.legend.form = ChartLegendFormCircle;//图示样式: 方形、线条、圆形
self.pieChartView.legend.formSize = 12;//图示大小

三、为饼状图提供数据

为饼状图提供数据, 首先需要创建两个数组yValsxVals, yVals数组存放饼状图每个区块的数据, xVals存放的是每个区块的名称或者描述.
接着需要用PieChartDataSet.h类创建dataSet对象, 创建时将yVals放进去.
然后需要用PieChartData.h类创建data对象, 创建时将xValsdataSet对象放进去.
最后直接把data对象赋值给饼状图的data属性即可. 创建data对象代码如下:

- (PieChartData *)setData{
    
    double mult = 100;
    int count = 5;//饼状图总共有几块组成
    
    //每个区块的数据
    NSMutableArray *yVals = [[NSMutableArray alloc] init];
    for (int i = 0; i < count; i++) {
        double randomVal = arc4random_uniform(mult + 1);
        BarChartDataEntry *entry = [[BarChartDataEntry alloc] initWithValue:randomVal xIndex:i];
        [yVals addObject:entry];
    }
    
    //每个区块的名称或描述
    NSMutableArray *xVals = [[NSMutableArray alloc] init];
    for (int i = 0; i < count; i++) {
        NSString *title = [NSString stringWithFormat:@"part%d", i+1];
        [xVals addObject:title];
    }
    
    //dataSet
    PieChartDataSet *dataSet = [[PieChartDataSet alloc] initWithYVals:yVals label:@""];
    dataSet.drawValuesEnabled = YES;//是否绘制显示数据
    NSMutableArray *colors = [[NSMutableArray alloc] init];
    [colors addObjectsFromArray:ChartColorTemplates.vordiplom];
    [colors addObjectsFromArray:ChartColorTemplates.joyful];
    [colors addObjectsFromArray:ChartColorTemplates.colorful];
    [colors addObjectsFromArray:ChartColorTemplates.liberty];
    [colors addObjectsFromArray:ChartColorTemplates.pastel];
    [colors addObject:[UIColor colorWithRed:51/255.f green:181/255.f blue:229/255.f alpha:1.f]];
    dataSet.colors = colors;//区块颜色
    dataSet.sliceSpace = 0;//相邻区块之间的间距
    dataSet.selectionShift = 8;//选中区块时, 放大的半径
    dataSet.xValuePosition = PieChartValuePositionInsideSlice;//名称位置
    dataSet.yValuePosition = PieChartValuePositionOutsideSlice;//数据位置
    //数据与区块之间的用于指示的折线样式
    dataSet.valueLinePart1OffsetPercentage = 0.85;//折线中第一段起始位置相对于区块的偏移量, 数值越大, 折线距离区块越远
    dataSet.valueLinePart1Length = 0.5;//折线中第一段长度占比
    dataSet.valueLinePart2Length = 0.4;//折线中第二段长度最大占比
    dataSet.valueLineWidth = 1;//折线的粗细
    dataSet.valueLineColor = [UIColor brownColor];//折线颜色
    
    //data
    PieChartData *data = [[PieChartData alloc] initWithXVals:xVals dataSet:dataSet];
    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    formatter.numberStyle = NSNumberFormatterPercentStyle;
    formatter.maximumFractionDigits = 0;//小数位数
    formatter.multiplier = @1.f;
    [data setValueFormatter:formatter];//设置显示数据格式
    [data setValueTextColor:[UIColor brownColor]];
    [data setValueFont:[UIFont systemFontOfSize:10]];
    
    return data;
}

运行结果如下:

运行结果

如果不需要空心样式的饼状图, 可以将饼状图的drawHoleEnabled赋值为NO, 将中间的文本去掉即可, 代码如下:

self.pieChartView.drawHoleEnabled = NO;

效果如下:

实心饼状图

每个区块之间如果需要间距, 可以通过dataSet对象的sliceSpace属性设置, 代码如下:

dataSet.sliceSpace = 3;

效果如下:


有区块间距的饼状图

由于属性较多, 其它效果可以自行尝试.
</br>
Demo 地址: PieChartDemo.
</br>

相关文章

  • iOS使用Charts框架绘制—饼状图

    iOS使用Charts框架绘制—饼状图[https://www.jianshu.com/p/45194d861b21]

  • Swift第三方Charts的简单使用

    Charts是一个强大的图表框架,MPAndroidChart 在 iOS 上的移植。可以绘制线形图,直方图,饼状...

  • iOS使用Charts框架绘制—饼状图

    首先先看一下效果: 一、创建饼状图对象 创建饼状图对象用到类是PieChartView.h, 代码如下: 二、设置...

  • 图表

    推荐 Charts框架之雷达图 Charts框架之饼状图 Charts框架之折线图 Charts框架之柱状图 Ch...

  • iOS在OC项目中集成Charts绘制图表框架

    Charts以一款用于绘制图表的框架,可以绘制柱状图、折线图、K线图、饼状图等. 由于Charts只有Swift版...

  • ios-charts在 oc 中使用(Xcode8.1)

    Charts以一款用于绘制图表的框架,可以绘制柱状图、折线图、K线图、饼状图等. 由于Charts只有Swift版...

  • iOS-在OC项目中集成Charts图形绘制框架

    前言 Charts以一款用于绘制图表的框架,可以绘制柱状图、折线图、K线图、饼状图等等. 由于Charts只有Sw...

  • [Swift]使用Charts绘制饼状图

    项目中用到了饼状图,在GitHub上搜索到一个比较好用的图表库Chars,里面包含了基本见过的各种图表库,这个项目...

  • iOS-Charts图形绘制框架使用

    前言 charts是一款图形绘制框架,可以绘制折线图、柱状图、k线图、饼状图、雷达图等。上一篇文章我们讲了一下这个...

  • charts3

    先进行charts饼状图的小测,如下,结果为正常饼状图 绘制前面数据库中的数据来找某一天交易的各类目物品的饼状图 ...

网友评论

  • 程守斌:怎么让底部的颜色view为原型?
  • 程守斌:怎么让底部的part1、part2、part3、part4居中?
  • CodingFire:你知道默认选中其中某一个怎么做么?
    独风孤月:没得这个属性
  • 方寸山_linyut:请教楼主,如果饼状图有3个模块,比例相等,都是1/3,显示的都是33.3%,三者之和不是100%,这个怎么解决?
  • Ego_1973:怎么不设置文字呢?我没有设置但还是出现了默认的dataset
  • 305e75f21954:您好,请问下,您知道怎么使饼状图中心的文本的文字居中显示吗?换行之后,默认是靠左显示的。谢谢!
  • 詹小白:楼主,图例后面怎么加百分比值呢
  • coolLee:求教:饼图上显示的百分比数据是charts自动转化的?为什么我设置的数据不能转成百分比,而是直接显示我传入的数据?
  • Freedom_fly:如果自己画的话 每个扇形区域的间隔怎么画啊?
  • HunterDude:如果数据都是0的话。会不会出现Bug呢? 会不会出现NaN呢?
  • 国王or乞丐:demo运行不起来,还请lz指教下
  • e8b4fb1ec272:BarChartDataEntry *entry = [[BarChartDataEntry alloc] initWithValue:val xIndex:i];
    [yVals addObject:entry];
    BarChartDataEntry的创建方法没有initWithValue:val xIndex:i,只有[[BarChartDataEntry alloc] initWithX:<#(double)#> y:<#(double)#>];
    怎么办???现在没有initWithValue:val xIndex:i,只有initWithX:<#(double)#> y:<#(double)#>
    冰山_X:请问你这个问题解决了吗?
  • ttdiOS:BarChartDataEntry *entry = [[BarChartDataEntry alloc] initWithValue:val xIndex:i];
    [yVals addObject:entry];
    BarChartDataEntry的创建方法没有initWithValue:val xIndex:i,只有[[BarChartDataEntry alloc] initWithX:<#(double)#> y:<#(double)#>];
    怎么办???现在没有initWithValue:val xIndex:i,只有initWithX:<#(double)#> y:<#(double)#>
    冰山_X:怎么解决的?是更换了方法了是吗?
    ttdiOS:@谢立 是的,解决了:blush:
    冰山_X:请问你这个问题解决了吗?
  • 我是姑姑思密达:请问 下面的图例中的描述和圆点能设置成垂直的吗
  • ea18e0e49539:有OC的库吗
  • 99744d7c4ad6: BarChartDataEntry *entry = [[BarChartDataEntry alloc] initWithValue:randomVal xIndex:i];
    我这句会包红为啥咧
    冰山_X:请问你这个问题解决了吗?
  • lsif的简书:请问,圆饼上每部分数据得颜色,折线和数据也能设置这样的颜色吗?
  • 简人Lmy:现在Charts3.0了,好多方法不一样了
  • 菊上一枝梅:Xcode8.2.1都不好使了
  • 简单周:有OC版本的库吗?github链接是swift的,swift不熟,试着去集成结果一堆问题。
  • 3ccda61010ed:请问分区的名称描述initWithXvals:xVals dataSet:dataSet方法改成什么啦?找死我了
  • 刘跃:不错, :+1: 就是Demo下载不下来,进入不了下载的界面 :sob: ,能重新发一下下载的链接么?
  • jinsxiong45:明天要用 希望谁可以发一份给我 在此拜谢
  • jinsxiong45:Dome下了好几次 下不下来 可以直接发给我一份么? jinsxiong45@163.com 邮箱
  • 6187a9e3cedb:请问 数据有多条 并且希望图例在下方展示的时候会出现图例只显示一部分的情况 这个该如何解决啊
  • 蜂蜜柚子茶v:大神,怎么配置到自己的项目里呀,#import "PieChartDemo-Swift.h"导入的时候老报错哦
    359ffa32de30:@蜂蜜柚子茶v 不需要这么导入的
  • 359ffa32de30:楼主,part显示的每个颜色小点怎么消除哦?研究你的demo研究了好久没找到解决的方法
    359ffa32de30:charts 的demo看不懂。还是找到你的demo才把大部分功能给解决了,在此拜谢 :pray:
  • 9o後侽孓:对于小白来说,一脸懵逼的样子
  • 758895f496cf:Xcode 升级到8.0 demo 报错啊 能cocoa pods导入吗 ? 导入语句是什么
  • 5f6e93cba308:请问我有个需求和这个挺像的 , 但是还是得根据需求设计饼状图,我可以改动chart框架实现的饼状图吗?
  • zgcrichard:第一句话是找到“PieChartView.h”,github上只有PieChartView.swift..
  • 40419c0f3260:楼主 为什么我按照你的教程提示没有initWithYVals这个方法 :sob:
    40419c0f3260:@小楠一个 试了很久楼主的不行,最后按照github上的那个demo来写了,你也试试吧
    e64126e5f7d1:@Vergil_H 一样阿
  • 98c2ec8027ab:楼主你好,我用charts框架做的饼状图,然后要外边显示相关的标签,由于有些比例比较小,导致一些标签重叠在一起,有什么属性或方法可以设置么
  • 三岁就喜欢学习:没有 数据的描述文字 是设置哪一个?
  • Polar丶bear:为什么我运行Demo 不报错也不显示界面?
  • faadf2ab2120:请问 当区块大小比较小的时候,标签相互遮盖,你有遇到吗?
    359ffa32de30:@justinlll 你把PieChartView设置大点。。
  • JoyGY:你好,在修改饼状图的时候遇到一个大问题,发现那个图例只能显示第一个,其他的无法显示,不知道是什么原因,可以帮忙解决一下吗?非常感谢,还有那个折线图的点击某个点显示这个点的具体数据,发现官方的demo上有那个类,但是我直接用swift写的,去文档里却没有发现,不知道你有没遇到过. 我的qq是1970313264,希望可以加一下qq指导一下
    jianshu_wl:@Joy_Hannah 自定义的我还没研究过, 你可以好好研究一下, 然后写一篇文章分享一下哦 :joy:
    JoyGY:@jianshu_wl 我确实是拖进去直接用的,但是需要根据需求进行修改一下,我怀疑是不是哪个地方冲突了或者什么的导致显示图例出不来,同样的设置在另一个小demo中就可以显示,说明设置的没有问题,之前用的静态数据,刚显示的时候有图例,然后一滑动cell再次显示的时候就变成了只有一个了,不知道你只不知道可能是什么原因呀?
    jianshu_wl:@Joy_Hannah 你可以直接把官方 demo 里面的那个类拖进去直接用 :joy:
  • DrunkenMouse:楼主,我看了你的DEMO,发现你能写出 [colors addObjectsFromArray:ChartColorTemplates.vordiplom];
    而我的ChartColor却死活也敲不出来,硬敲出来也只会报错,而且我的swift文件里不能使用import Foundation不然编译就报错,去掉却就好了,你有什么思路吗?
  • wsj2012:demo 编译报错
    jianshu_wl:@wsj2012 你看一下我介绍集成的那篇文章,看一下你运行的环境有没有问题,Xcode 是7.3才可以:smile:
  • AllenYukin:可以cocoaPods 导入么
    小灬博:楼主 用swift写的吗?有没有用OC写的 ?项目里边需要这个 谢谢
    758895f496cf:cocoaPods 导入语句是什么啊?
    jianshu_wl:@Hy丶 可以
  • JoyGY:你好,我想请教个问题,就是那个设置图例的那,为什么我设置了显示的却只有一个呢,设置的感觉没有问题,就是找不到是哪的原因,可以指导一下吗?非常感谢
  • AllenYukin:必须要桥接整个项目么 这是swift的东西吧
    AllenYukin:@jianshu_wl 公司项目 用的话 会不会有问题- - 比如加载速度 或者UI 稳定 哥们用的 挺好的么
    jianshu_wl:@Hy丶 是的
  • 9f94d02340f1:收下了,好东西!
  • WenJim:这个看起来不错啊,适合教育,金融那类的APP
    Ego_1973:教育金融都做过路过..
  • 小恺:也是不好找
    jianshu_wl:@小恺 什么不好找?
  • 2068e5e51f60:啥时候出个柱状图的demo呗
    jianshu_wl:@黄立波 有柱状图的,看这里:http://www.jianshu.com/p/5f777671e9e4?utm_campaign=hugo&utm_medium=reader_share&utm_content=note
  • code_间特门:可以的,总有人来做一些别人没做过的东西,这波不亏 :smile:
  • 瞳若点星: :smiley: 看起来效果好炫啊
  • 0fca43804da3:挺不错
  • HYD枫:先学习学习!!!

本文标题:iOS使用Charts框架绘制—饼状图

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