在Core Plot中,饼图是一类特殊的图形。因为它不需要显示坐标轴。数据不以坐标象限内的点表示,而以椭圆中的扇形面积表示。

16.1.1. 饼图的绘制

CorePlot用CPTPieChart 对象代表一个饼图。在 CPTGraph 中添加一个饼图很简单,以下代码向 pieChart 中绘制了一个饼图:

CPTPieChart*piePlot = [[CPTPieChart alloc] init];

piePlot.dataSource = self;

piePlot.pieRadius = 131.0;

piePlot.identifier =@"Pie Chart 1";

piePlot.startAngle = M_PI_4;

piePlot.sliceDirection = CPTPieDirectionCounterClockwise;

piePlot.centerAnchor = CGPointMake(0.5, 0.38);

piePlot.borderLineStyle= [CPTLineStyle lineStyle];

piePlot.delegate = self;

[pieChartaddPlot:piePlot];

[piePlotrelease];

从代码中可见,alloc、init一个 CPTPieChart 对象后,需要设置它的一些属性并 addPlot 到CPTGraph 中。CPTPieChart的属性很多,上述代码使用到了如下属性:

dataSource属性 - 指定饼图的数据源。数据源必须实现 CPTPieDataSource 委托。

pieRadius属性 - 饼图的半径。

startAngle属性 - 第1片扇形的起始角度,默认是PI/2。

sliceDirection属性 - 扇形绘制的方向:正时针、反时针。

centerAnchor属性 - 饼图的重心(旋转时以此为中心)坐标(x,y),以相对于饼图直径的比例表示(0-1)之间。默认和圆心重叠(0.5,0.5)。

borderLineStyle属性 - 饼图边线的样式。

delegate属性 - 指定饼图的事件委托。委托必须实现 CPTPieChartDelegate 中定义的方法。

最重要的是数据源方法。我们假设用数组model 定义了扇形的分布比例,则CPTPieChartDataSource 委托可实现如下:

-(NSUInteger)numberOfRecordsForPlot:(CPTPlot*)plot

{

return[model count];

}

-(NSNumber*)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnumrecordIndex:(NSUInteger)index

{

return[model objectAtIndex:index];

}

numberOfRecordsForPlot:方法是重要的,它告诉CorePlot 需要绘制几个数据点。当然对于每种图形来说,绘制数据点的方式不一样。对于散点图,每个数据点会被绘制为节点,对于柱状图,每个数据点会被绘制为柱子,而对于饼图,每个数据点用不同弧度的扇形表示。

在CorePlot 具体绘制图形时,它根据数据源方法返回的数据点数来绘制每一个点。每绘制一个点都会来调用numberForPlot:field:recordIndex:方法,但调用的次数不一。因为每种图形在描述每个点时需要的数据不一样。比如柱状图和散点图,每个点以二维表示(x,y),则CorePlot对每个点都会调用两次xxxForPlot:field:recordIndex:方法。每次调用时,依靠field参数来区分是请求x坐标还是y坐标(recordIndex参数则指定是第几个数据点)。

而对于饼图,每个点只需要一个数字描述(百分比),因此只会调用一次xxForPlot:field:recordIndex方法。我们直接根据index索引返回model数组中的数值就可以了。

16.1.2. 显示每个扇形的比例

默认情况下,饼图不显示 Data Label。如果要显示 Data Label,需要实现数据源的 dataLabelForPlot:recordIndex: 方法。以下代码在每个扇形的Data Label上显示百分比数字:

-(CPTLayer*)dataLabelForPlot:(CPTPlot *)plot recordIndex:(NSUInteger)index

{

float f=((NSNumber*)[modelobjectAtIndex:index]).floatValue;

CPTTextLayer *label = [[CPTTextLayeralloc] initWithText:[NSString stringWithFormat:@"%.1f%%",f]];

CPTMutableTextStyle *textStyle =[label.textStyle mutableCopy];

textStyle.color = [CPTColor lightGrayColor];

label.textStyle = textStyle;

[textStyle release];

return [label autorelease];

}

16.1.3. 剥离扇形

对于饼图,我们可以把某块扇形“切除”下来,以此突出该扇形区域。这需要实现数据源方法radialOffsetForPieChart:recordIndex: 方法。以下代码将饼图中第2块扇形“剥离”10个像素点:

-(CGFloat)radialOffsetForPieChart:(CPTPieChart*)piePlot recordIndex:(NSUInteger)index{

return (indexix==1?10:0);

}

16.1.4. 显示图例

图例可用于描述图形(尤其是饼图)的构成部分。以下代码显示了饼图的图例:

CPTLegend *theLegend = [CPTLegendlegendWithGraph:pieChart];

theLegend.numberOfColumns= 1;

theLegend.fill=[CPTFill fillWithColor:[CPTColor lightGrayColor]];

theLegend.borderLineStyle= [CPTLineStyle lineStyle];

theLegend.cornerRadius=5.0;

pieChart.legend= theLegend;

pieChart.legendAnchor=CPTRectAnchorTopRight;

pieChart.legendDisplacement= CGPointMake(-30.0, -30.0);

图例由 CPTLengend 对象表示。上述代码中,分别设置了 CPTLengend 的如下属性:

numberOfColumns属性 - 图例的列数。有时图例太多,单列显示太长,可分为多列显示。

fill属性 - 图例的填充属性,CPTFill 类型。

borderLineStyle属性 - 图例外框的线条样式。

cornerRadiuss属性 - 图例外框的圆角半径。

把一个图例对象赋值给图形的 legend 属性,即可在绘制图形时加上图例。此外还图形对象还有两个和图例相关的重要属性:

legendAnchor属性 - 图例对齐于图框的位置,可以用 CPTRectAnchor 枚举类型,指定图例向图框的4角、4边(中点)对齐。

legendDisplacement属性 - 图例对齐时的偏移距离。注意,对齐时是使用图例的相同锚点和图框的相同锚点对齐。比如,图形的legendAnchor属性是右上角(CPTRectAnchorTopRight),则对齐时用图例的右上角和图框的右上角进行对齐。这个偏移坐标(x,y)就是这两个锚点之间的距离(用图例的锚点坐标减图框的锚点坐标)。默认legendDisplacement为(0,0)。注意这个值的正负关系,比如(-30,-30)和(30,30)是截然相反的,你多试几次就明白了。

图例上的描述文字,从数据本身是看不到的,默认情况下 CorePlot 会以“Pie Chart 1”、“Pie Char 2”来命名。

我们需要实现数据源方法legendTitleForPieChart:recordIndex:来覆盖默认的图例名称:

-(NSString*)legendTitleForPieChart:(CPTPieChart *)pieChart recordIndex:(NSUInteger)index{

switch (index) {

case 0:

return @"其他";

case 1:

return @"Google Android";

case 2:

return @"Apple iOS";

default:

return nil;

}

}

设置某个扇形的颜色:-(CPTFill*)sliceFillForPieChart:(CPTPieChart*)pieChart recordIndex:(NSUInteger)index //CPTPieChartDataSource

点击某个扇形响应操作:-(void)pieChart:(CPTPieChart*)plot sliceWasSelectedAtRecordIndex:(NSUInteger)index //CPTPieChartDelegate

//添加立体效果

- (void)addOverLayFillWithPieChart:(CPTPieChart *)piePlot

{

CPTGradient *gradient = [[CPTGradient alloc]init];

gradient.gradientType = CPTGradientTypeRadial;

//设置颜色变换的颜色和位置

gradient = [gradient addColorStop:[[CPTColor blackColor] colorWithAlphaComponent:0.1] atPosition:0.9];

gradient = [gradient addColorStop:[[CPTColor blackColor] colorWithAlphaComponent:0.5] atPosition:0.5];

gradient = [gradient addColorStop:[[CPTColor blackColor] colorWithAlphaComponent:0.3] atPosition:0.9];

piePlot.overlayFill = [CPTFill fillWithGradient:gradient];

}

CorePlot-饼状体相关推荐

  1. 怎么用python画饼状图_Python入门进阶:Python绘制饼图到Microsoft Excel

    原标题:Python入门进阶:Python绘制饼图到Microsoft Excel 来自:Linux迷https://www.linuxmi.com/python-pie-chart-microsof ...

  2. Unity_扇形图(饼状图)+ UI动画

    GitHub项目链接点这里(求一个star⭐) Unity_扇形图(饼状图)+ UI动画 效果 介绍 关键字 分析及代码 绘图数据 扇形元素 UIPieImage 1.定义参数 2.颜色注解 3.画扇 ...

  3. 安卓饼状图设置软件_话单及银行卡交易智能分析软件

    一.产品概况: 思迈奥SMILE数据智能分析软件是由我司自主设计与研发的一款结合在公安和检察院的侦查业务经验而定制研发的数据智能分析系统,包含于话单.电子银行账单.及其它数据(个人出行数据.社会资源数 ...

  4. android饼状图简书,Charts-饼状图

    上篇文章已经讲述了折线图的用法这边文章主要来谈饼状图. 其实Charts难的部分主要在于配置,所以同样主要说说他的配置. pieGraphView.setExtraOffsets(left: 10, ...

  5. echart饼状图没有数据的时候显示暂无数据_Python数据结构可视化 day 5

    Python 数据结构可视化 (Day5) 01年度工作总结 有时候画布太大,影响到图表的展示,这个时候输入: "init_opts=opts.InitOpts(width='',heigh ...

  6. echart的关系图高亮_echart中饼状图的高亮显示。

    1 2 3 4 5 6 7 8 9 10 #main{ 11 width:50vw;height:60vh;margin-left:2vw 12 } 13 14 15 16 17 18 19 20 / ...

  7. C#应用NPOI实现导出EXcel表格中插入饼状图(可实现动态数据生成)

    一.思路:   1.excel是可以通过NPOI插入图片的: 2.C#通过NPOI生成饼状图: 3.把生成的饼状图以字节流的形式插入到表格 二.看代码: #region 生成饼图图例/// <s ...

  8. mysql 统计做饼状图_PHP+mysql+Highcharts实现饼状统计图

    Mysql 首先我们建一张・chart_pie・表作为统计数据. -- edit http://www.lai18.com -- 表的结构 `chart_pie` -- CREATE TABLE IF ...

  9. .net之生成图表的控件(柱状图,曲线图,饼状图) [转]

    可以生成柱状图,曲线图,饼状图,只要你给他一个datatable,在这声明一下 using System; using System.Web.UI; using System.Data; using  ...

  10. Iocomp控件教程之Pie Chart——饼状图控件

    Pie Chart--饼状图控件(Pie Chart)以饼状图形式显示每一个项目内容所占的百分比比重.在设计时.能够使用属性编辑器加入或者移除项目以及更改属性值.在执行时.使用AddItem,Remo ...

最新文章

  1. 生成式对抗网络GAN有哪些最新的发展,可以实际应用到哪些场景中
  2. 新手教程:如何改变应用名称
  3. 移植opencv3.20到3556AV100
  4. 理解js中的原型链,prototype与__proto__的关系
  5. ROCKOUT软件测试工程师,具透丨这才是让 iMessage 变得好玩有用的原因:iMessage App Store 详解...
  6. ajax静态加载图片,JQuery实现Ajax加载图片的方法
  7. Git实现从本地添加项目到远程仓库
  8. SpringBoot:Unable to start LiveReload server(已解决)
  9. 一步步学习SPD2010--第九章节--使用可重用工作流和工作流表单(13)--修改任务表单...
  10. Window10问题一揽子解决方案(自动唤醒,自动更新,卸载自带office16,华硕卸载myasus以及myasus频繁提示更新,停用WindowDefender)
  11. 超全Inventor 3d模型素材网站整理
  12. 边缘检测——sobel索伯算子 数学原理和应用
  13. 英飞凌 AURIX 系列单片机的HSM详解(3)——开发方法
  14. MATLAB编程算矩阵,MatLab矩阵计算
  15. 好奇那些进了大厂的程序员面试前都做了哪些准备?Android大厂面试官全套教程教你:这样准备面试顺利拿到offer
  16. 【LOD for 3D Graphics】LOD技术背景调查
  17. 解决Windows开机后无启动项的问题
  18. VS2019菜单栏的项目、生成、格式三个菜单栏不见了
  19. 按ASC码对字符串排序
  20. azure java sdk_使用 Azure SDK for Java

热门文章

  1. vue中引用swiper轮播插件
  2. Java Servlet web xml 配置详解
  3. Ubuntu:高效工作环境搭建
  4. Centos下安装MySQL全过程(linux下安装MySQL)
  5. 和平之翼代码生成器 SMEU 版 4.0.0 RC 宝船候选版发布
  6. 为什么要学习Linux操作系统?
  7. 前端入门-day2(常见css问题及解答)
  8. iOS开发-UITableView常用方法
  9. 采用truelicense进行Java规划license控制 扩展可以验证后,license 开始结束日期,验证绑定一个给定的mac住址...
  10. Linux GDB Debugging