CorePlot_1.5.1 绘制饼状图

转自http://blog.csdn.net/xj2014/article/details/41791513

前言

在讲述绘制散点图那篇已经详细说明了宿主View、图表CPTXYGraph、绘图空间、坐标系、以及图例的创建过程。当然在绘制饼状图中是不需要坐标系的。效果图如下:



数据源与填充色:

  1. NSMutableArray *dataSource = [NSMutableArray arrayWithCapacity:10];  
  2. for (int i = 0; i < 6; i++) {  
  3.     [dataSource addObject:@(arc4random()%10)];  
  4. }  
  5. for (int i = 0; i < 6; i++) {  
  6.     CGFloat scale = [dataSource[i] floatValue] / [[dataSource valueForKeyPath:@"@sum.self"] floatValue];  
  7.     [dataSource replaceObjectAtIndex:i withObject:@(scale)];  
  8. }  
  9. self.dataSource = dataSource;  
  10. _sliceFills = @[[CPTColor greenColor],  
  11.                 [CPTColor lightGrayColor],  
  12.                 [CPTColor cyanColor],  
  13.                 [CPTColor yellowColor],  
  14.                 [CPTColor magentaColor],  
  15.                 [CPTColor purpleColor]];  

由于在绘制饼状图的过程中是不需要坐标轴的,所以我们要去除坐标系,如果不去除坐标系,我们将会看到,坐标轴的黑色轴线。
  1. // 饼图不需要显示坐标轴  
  2. _hostView.hostedGraph.axisSet = nil;  

饼状图(CPTPiePlot)创建

CPTPiePlot用于创建饼状图,继承于CPTPlot。

  1. #pragma mark 创建平面图,饼图  
  2. - (void)createPlots  
  3. {  
  4.     // 饼图初始化  
  5.     CPTPieChart *piePlot = [[CPTPieChart alloc] init];  
  6.       
  7.     // 添加图形到绘图空间  
  8.     [_hostView.hostedGraph addPlot:piePlot];  
  9.       
  10.     // 标识,根据此@ref identifier来区分不同的plot  
  11.     piePlot.identifier = @"PieChart";  
  12.       
  13.     // 指定饼图的数据源。数据源必须实现 CPTPieDataSource 委托  
  14.     piePlot.dataSource = self;  
  15.       
  16.     // 指定饼图的事件委托。委托必须实现 CPTPieChartDelegate 中定义的方法  
  17.     piePlot.delegate = self;  
  18.       
  19.     // 饼图设置  
  20.     {  
  21.         // 饼图的半径  
  22.         piePlot.pieRadius = CPTFloat(200);  
  23.         // 内部圆  
  24.         piePlot.pieInnerRadius = CPTFloat(10);  
  25.         // 开始绘制的位置,第1片扇形的起始角度,默认是PI/2  
  26.         piePlot.startAngle = 0;  
  27.         // 绘制的方向:正时针、反时针  
  28.         piePlot.sliceDirection = CPTPieDirectionClockwise;  
  29.         // 边线的样式  
  30.         piePlot.borderLineStyle= nil;  
  31.         // 饼图的重心(旋转时以此为中心)坐标(x,y),以相对于饼图直径的比例表示(0-1)之间。默认和圆心重叠(0.5,0.5)  
  32.         piePlot.centerAnchor = CGPointMake(0.50.5);  
  33.           
  34.         // 覆盖色  
  35.         //CPTGradient *gradient = [[CPTGradient alloc]init];  
  36.         // 剃度效果  
  37.         //gradient.gradientType = CPTGradientTypeRadial;  
  38.         // 设置颜色变换的颜色和位置  
  39.         //gradient = [gradient addColorStop:[[CPTColor blackColor] colorWithAlphaComponent:0.1] atPosition:0.9];  
  40.         //gradient = [gradient addColorStop:[[CPTColor blackColor] colorWithAlphaComponent:0.5] atPosition:0.5];  
  41.         //gradient = [gradient addColorStop:[[CPTColor blackColor] colorWithAlphaComponent:0.3] atPosition:0.9];  
  42.         //piePlot.overlayFill = [CPTFill fillWithGradient:gradient];  
  43.     }  
  44.       
  45.     // 扇形上的标签文字设置  
  46.     {  
  47.         // 是否顺着扇形的方向  
  48.         piePlot.labelRotationRelativeToRadius = YES;  
  49.         // 偏移量  
  50.         piePlot.labelOffset = -(piePlot.pieRadius - piePlot.pieInnerRadius) * 0.6;  
  51.     }  
  52.       
  53.     // 添加动画  
  54.     CABasicAnimation *fadeInAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"];  
  55.     fadeInAnimation.duration            = 3.0f;  
  56.     fadeInAnimation.removedOnCompletion = NO;  
  57.     fadeInAnimation.fillMode            = kCAFillModeForwards;  
  58.     fadeInAnimation.toValue             = [NSNumber numberWithFloat:1.0];  
  59.     piePlot.opacity = 0.f;  
  60.     [piePlot addAnimation:fadeInAnimation forKey:@"animateOpacity"];  
  61. }  

CPTPiePlotDataSource数据源方法

  1. #pragma mark 询问有多少个扇形  
  2. - (NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot  
  3. {  
  4.     return self.dataSource.count;  
  5. }  
  6.   
  7. #pragma mark 询问扇形的数据值  
  8. - (NSNumber *)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)idx  
  9. {  
  10.     NSNumber *num = self.dataSource[idx];  
  11.     return num;  
  12. }  
  13.   
  14. #pragma mark 扇形颜色  
  15. - (CPTFill *)sliceFillForPieChart:(CPTPieChart *)pieChart recordIndex:(NSUInteger)idx  
  16. {  
  17.     CPTFill *color = [CPTFill fillWithColor:_sliceFills[idx]];  
  18.     return color;  
  19. }  
  20.   
  21. #pragma mark 扇形名称  
  22. - (CPTLayer *)dataLabelForPlot:(CPTPlot *)plot recordIndex:(NSUInteger)idx  
  23. {  
  24.     CPTTextLayer *label = [[CPTTextLayer alloc] initWithText:[NSString stringWithFormat:@"饼图-%d",(int)(idx + 1)]];  
  25.       
  26.     CPTMutableTextStyle *textStyle =[label.textStyle mutableCopy];  
  27.     textStyle.color = [CPTColor blackColor];  
  28.     textStyle.fontSize = CPTFloat(17);  
  29.       
  30.     label.textStyle = textStyle;  
  31.       
  32.     return label;  
  33. }  
  34.   
  35. #pragma mark 剥离扇形  
  36. - (CGFloat)radialOffsetForPieChart:(CPTPieChart *)pieChart recordIndex:(NSUInteger)idx  
  37. {  
  38.     return idx == 2 ? 10 : 0;  
  39. }  
  40.   
  41. #pragma mark 图例名称 返回nil则不显示该索引下的图例  
  42. - (NSString *)legendTitleForPieChart:(CPTPieChart *)pieChart recordIndex:(NSUInteger)idx  
  43. {  
  44.     NSString *legendTitle = [NSString stringWithFormat:@"饼图-%d",(int)(idx + 1)];  
  45.     return legendTitle;  
  46. }  

CPTPiePlotDelegate委托方法

  1. #pragma mark 选中扇形的操作  
  2. - (void)pieChart:(CPTPieChart *)plot sliceWasSelectedAtRecordIndex:(NSUInteger)idx withEvent:(UIEvent *)event  
  3. {  
  4.       
  5. }  

图例(CPTLegend)的创建

由于在饼状图中的图例就是每一个扇形,所以我们只可以用以下的方法创建索引。

  1. CPTLegend *legend = [CPTLegend legendWithPlots:_hostView.hostedGraph.allPlots];  
  2. CPTLegend *legend = [CPTLegend legendWithGraph:_hostView.hostedGraph]  

饼状图的一些求值方法

  1. // 获取某个索引下扇形的中间的弧度  
  2. CGFloat medianAngle = [piePlot medianAngleForPieSliceIndex:0];  
  3. // 计算某个弧度下的扇形索引  
  4. NSInteger sliceIndex = [piePlot pieSliceIndexAtAngle:CPTFloat(0)]; 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值