首先先看一下效果:

一、创建饼状图对象

 

创建饼状图对象用到类是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. poj2017简单题

    #include <stdio.h> #include <stdlib.h> int main() { int n,i; while(scanf("%d", ...

  2. poj2186 Popular Cows --- 强连通

    给一个有向图,问有多少结点是其它全部结点都能够到达的. 等价于,在一个有向无环图上,找出度为0 的结点.假设出度为0的结点仅仅有一个,那么这个就是答案.假设大于1个.则答案是0. 这题有环.所以先缩点 ...

  3. android样式布局---&gt;ListView(附上源代码)

    在android应用开发过程中,Listview 是经常使用的数据展现控件,往往用于显示列表形式的数据. 假设只显示数据往往会显得非常单调.非常多时候依据须要定义不同的item 背景选项.比如定义数据 ...

  4. LeetCode总结 -- 高精度篇

    我们常见的一些主要的数据结构比方整型int或者浮点型float由于位数过多无法用内置类型存储,这时候我们就须要自己实现高精度的数据类型来进行存储和运算.这样的问题在实际产品中还是比較有用的,所以相对来 ...

  5. hahahahah

    dsfsefesfsffsfsfsfsfesfsfsfsfsfsfspackage realm;   import java.util.ArrayList; import java.util.List ...

  6. javascript中数据类型转换

    转换为数字: parseInt():转换为整数型数值:从下标0开始判断,若为数值型则继续直到遇到非数值,返回前面的整数值: 小数点无效,若0开始为非数值则返回NaN: 转换空字符串会返回NaN: 能转 ...

  7. Div实现滚动条效果

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. java 对象数组定义

    下面代码实现了定义一个数组对象 public class Student { private String username; private int num; public Student(Stri ...

  9. Memcached基础

    1.实例化 MemcachedClient client = new XMemcachedClient(); public XMemcachedClient() public XMemcachedCl ...

  10. 转场动画1-Push 动画

    先上效果图: 这篇文章完全是为造轮子制作:原作者是码农界的吴彦祖 作者视频下载地址 好的,我梳理一下思路: 理清思路 ||转场动画可以理解为一个对象,在这个对象里封装了一个动画.具体的我们跟着代码走 ...