首先先看一下效果:

一、创建饼状图对象

 

创建饼状图对象用到类是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];

5. 设置饼状图图例样式

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;//图示大小

三、为饼状图提供数据

为饼状图提供数据, 首先需要创建两个数组yVals和xVals, yVals数组存放饼状图每个区块的数据, xVals存放的是每个区块的名称或者描述。

接着需要用PieChartDataSet.h类创建dataSet对象, 创建时将yVals放进去。

然后需要用PieChartData.h类创建data对象, 创建时将xVals和dataSet对象放进去。

最后直接把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;

效果如下:

由于属性较多, 其它效果可以自行尝试。

Demo 地址: PieChartDemo

iOS 饼状图的更多相关文章

  1. ios swift 实现饼状图进度条,swift环形进度条

    ios swift 实现饼状图进度条 // // ProgressControl.swift // L02MyProgressControl // // Created by plter on 7/2 ...

  2. iOS:使用贝塞尔曲线绘制图表(折线图、柱状图、饼状图)

    1.介绍: UIBezierPath :画贝塞尔曲线的path类 UIBezierPath定义 : 贝赛尔曲线的每一个顶点都有两个控制点,用于控制在该顶点两侧的曲线的弧度. 曲线的定义有四个点:起始点 ...

  3. [BOT]自己动手实现android 饼状图,PieGraphView,附源码解析

    本文要介绍的是一个参照手机支付宝app里面记账本功能里的"饼状图"实现的控件.通常app中可能的数据展示控件有柱状图,折线图,饼状图等,如果需要一个包含多种View控件的库,那么 ...

  4. highcharts饼状图使用案例

    在公司由于需要对订单数据进行分析,故使用到了highcharts工具 <block name="Js"> <script type="text/java ...

  5. C#+JQuery+.Ashx+百度Echarts实现全国省市地图和饼状图动态数据图形报表的统计

    在目前的一个项目中,需要用到报表表现数据,这些数据有多个维度,需要同时表现出来,同时可能会有大量数据呈现的需求,经过几轮挑选,最终选择了百度的echarts作为报表基础类库.echarts功能强大,界 ...

  6. arcgis api for flex之专题图制作(饼状图,柱状图等)

    最近公司给我一个任务,就是利用arcgis api for flex实现在地图上点(业务数据)直接显示饼状图以及柱状图的专题图制作,而不是通过点击点显示气泡窗口的形式来实现,这个公司已经实现了. 经过 ...

  7. 用CAShapeLayer实现一个简单的饼状图(PieView)

    自己写了一个简单的PieView,demo在这里:https://github.com/Phelthas/LXMPieView 效果如图: 参考了https://github.com/kevinzho ...

  8. ECharts学习(2)--饼状图之南丁格尔图

    1.上一篇中讲了如何绘制一个简单的柱状图,这次要画的是饼图,饼图主要是通过扇形的弧度表现不同类目的数据在总和中的占比,它的数据格式比柱状图更简单,只有一维的数值,不需要给类目.因为不在直角坐标系上,所 ...

  9. Android开源图表之树状图和饼状图的官方示例的整理

    最近由于工作需要,所以就在github上搜了下关于chart的三方框架 官方地址https://github.com/PhilJay/MPAndroidChart 由于工作需要我这里整理了一份Ecli ...

随机推荐

  1. eclipse 快捷方式大全

    Ctrl+1 快速修复(最经典的快捷键,就不用多说了)Ctrl+D: 删除当前行 Ctrl+Alt+↓ 复制当前行到下一行(复制增加)Ctrl+Alt+↑ 复制当前行到上一行(复制增加)Alt+↓ 当 ...

  2. mongoose post方法总结and疑点

    官方文档代码: var schema = new Schema(..); schema.post('save', function (doc) { console.log('this fired af ...

  3. Rikka with Chess(规律)

    Rikka with Chess Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  4. 城市平乱(Bellman)

    城市平乱 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 南将军统领着N个部队,这N个部队分别驻扎在N个不同的城市. 他在用这N个部队维护着M个城市的治安,这M个城市 ...

  5. Solrj日期范围查询

    在做依据日期来检索的时候普通的格式化会出错,试了好多种仅仅有一种可行 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH ...

  6. C++ 清空消息队列

    在button等被禁用后,可能须要它在禁用期间不去响应不论什么消息. 能够使用以下的语句片段: MSG msg; //消耗掉消息队列中的全部消息 while(::PeekMessage(&ms ...

  7. Java面试题之五

    二十一.super()与this()的区别? (1)用this的情况: 1.在构造方法中,通过this调用另一个构造方法,用法:this(参数列表). 2.在函数参数或函数的局部变量与成员变量同名,即 ...

  8. CodeForces Round #179 (295A) - Greg and Array 一个线段树做两次用

    线段树的区间更新与区间求和...一颗这样的线段树用两次... 先扫描1~k...用线段树统计出每个操作执行的次数... 那么每个操作就变成了 op. l  , op.r , op.c= times* ...

  9. javaScript 工作必知(二) null 和undefined

    null null 表示个“空” , 使用typeof (null) ;//Object ; 说明他是一个特殊的对象. null 类型只自己唯一个成员.他是不包含属性和方法的. undefined u ...

  10. 列表的实现-----数据结构与算法JavaScript描述 第三章

    实现一个列表 script var booklist = new List(); booklist.append('jsbook'); booklist.append('cssbook'); book ...