CorePlot 的高级用法-画扇形图和折线图

![Uploading 屏幕快照 2017-04-24 下午4.58.32_334202.png . . .]
CorePlot的基础学习可以去看这个CorePlot柱状图基础学习

下面我们要做的视图如下图实例1和实例2所示(Demo传送门):

扇形图
折线图
曲线图
  • 实现扇形,并且实现每个扇形板块的数据,具体代码如下:
#import "ViewController.h"
#import "CorePlot-CocoaTouch.h"

@interface ViewController ()<CPTPlotDataSource,CALayerDelegate>
@property (nonatomic, strong) NSMutableArray *arr;
@property (nonatomic, strong) CPTXYGraph *graph;
@property (nonatomic, strong) CPTPieChart *piePlot;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
   
    // 创建画布
    self.graph = [[CPTXYGraph alloc] initWithFrame:self.view.bounds];
    // 设置画布主题
    CPTTheme *theme = [CPTTheme themeNamed:kCPTPlainWhiteTheme];
    [self.graph applyTheme:theme];
    // 画布与周围的距离
    self.graph.paddingTop = 10.0f;
    self.graph.paddingLeft = 5.0f;
    self.graph.paddingRight = 5.0f;
    self.graph.paddingBottom = 10.0f;
    // 将画布的坐标轴设置为空
    self.graph.axisSet = nil;
    
    // 创建画板
    CPTGraphHostingView *hostView= [[CPTGraphHostingView alloc] initWithFrame:self.view.bounds];
    // 设置画板的画布
    hostView.hostedGraph =  self.graph;
    // 设置画布标题的风格
    CPTMutableTextStyle *whiteText = [CPTMutableTextStyle textStyle];
    whiteText.color = [CPTColor blackColor];
    whiteText.fontName = @"Helvetica-Bold";
    whiteText.fontSize = 18.0;
    self.graph.titleTextStyle = whiteText;
    self.graph.title = @"饼状图";
    
    // 创建饼图对象
    self.piePlot = [[CPTPieChart alloc] initWithFrame:CGRectMake(10, 10, 200, 200)];
    // 设置数据源
    self.piePlot.dataSource = self;
    // 设置饼状图半径
    self.piePlot.pieRadius = 100.0;
    //设置饼图表示符
    self.piePlot.identifier =@"pie chart";
    //饼图开始绘制的位置
    self.piePlot.startAngle =M_PI_4;
    //饼图绘制的方向(顺时针/逆时针)
    self.piePlot.sliceDirection = CPTPieDirectionCounterClockwise;
    //饼图的重心
    self.piePlot.centerAnchor =CGPointMake(0.5,0.38);
    //饼图的线条风格
    self.piePlot.borderLineStyle = [CPTLineStyle lineStyle];
    //设置代理
    self.piePlot.delegate =self;
    //将饼图加到画布上
    [self.graph addPlot:self.piePlot];
    
    //将画板加到视图上
    [self.view addSubview:hostView];
    
    //创建图例
    CPTLegend *theLegeng = [CPTLegend legendWithGraph:self.graph];
    theLegeng.numberOfColumns =1;
    theLegeng.fill = [CPTFill fillWithColor:[CPTColor whiteColor]];
    theLegeng.borderLineStyle = [CPTLineStyle lineStyle];
    theLegeng.cornerRadius =5.0;
    theLegeng.delegate =self;
    
    self.graph.legend = theLegeng;
    self.graph.legendAnchor = CPTRectAnchorRight;
    self.graph.legendDisplacement =CGPointMake(-10,100);

}

//返回扇形数目
- (NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot {
    return self.arr.count;
}
//返回每个扇形的比例
- (NSNumber *)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)idx {
    return [self.arr objectAtIndex:idx];
}

//凡返回每个扇形的标题
- (CPTLayer *)dataLabelForPlot:(CPTPlot *)plot recordIndex:(NSUInteger)idx
{
    CPTTextLayer *label = [[CPTTextLayer alloc]initWithText:[NSString stringWithFormat:@"hello,%@",[self.arr objectAtIndex:idx]]];
    CPTMutableTextStyle *text = [label.textStyle mutableCopy];
    text.color = [CPTColor whiteColor];
    return label;
}

//选中某个扇形时的操作
- (void)pieChart:(CPTPieChart *)plot sliceWasSelectedAtRecordIndex:(NSUInteger)idx
{
    self.graph.title = [NSString stringWithFormat:@"比例:%@",[self.arr objectAtIndex:idx]];
}



//返回图例
- (NSAttributedString *)attributedLegendTitleForPieChart:(CPTPieChart *)pieChart recordIndex:(NSUInteger)idx
{
    NSAttributedString *title = [[NSAttributedString alloc]initWithString:[NSString stringWithFormat:@"hi:%lu",(unsigned long)idx]];
    
    return title;
}

- (NSMutableArray *)arr {
    if (!_arr) {
        _arr = [NSMutableArray arrayWithObjects:@"1.0",@"3.0",@"1.0",@"2.0",@"2.0", nil];
    }
    return _arr;
}
  • 实现折线图,并且实现折点显示数据,具体代码如下:
#import "ViewController.h"
#import "CorePlot-CocoaTouch.h"
@interface ViewController ()<CPTPlotDataSource>
{
    NSMutableArray *_dataArray;
}
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 初始化数组, 并放入十个 0-20 间的随机数
    _dataArray = [[NSMutableArray alloc] init];
    for (int i = 0; i < 10; i++) {
        [_dataArray addObject:[NSNumber numberWithInt:rand()%20]];
    }
    
    CGRect frame = CGRectMake(20, 100, self.view.bounds.size.width - 40, 200);
    
    // 图形要放在一个CPTGraphHostingView中, CPTGraphHostingView继承 UIView的
    // 创建画板
    CPTGraphHostingView *hostView = [[CPTGraphHostingView alloc] initWithFrame:frame];
    // 把CPTGraphHostingView 加在自己的view中
    [self.view addSubview:hostView];
    hostView.backgroundColor = [UIColor grayColor];
    
    // 在 CPTGraph 中画图, 这里的CPTXYGraph 是个曲线图
    // 要指定CPTGraphHostingView 的hostteGraoh 属性来关联
    CPTXYGraph *graph = [[CPTXYGraph alloc] initWithFrame:hostView.frame];
    graph.identifier = @"test";
    hostView.hostedGraph = graph;
    
    // 设置曲线
    CPTScatterPlot *scatterPlot =[[CPTScatterPlot alloc] initWithFrame:graph.bounds];
    [graph addPlot:scatterPlot];
    scatterPlot.dataSource = self;//设定数据源,需应用CPTPlotDataSource 协议
    
    // 设置PlotSpace,这里的 xRange 和 yRange 要理解好,它决定了点是否落在图形的可见区域
    //location值表示坐标起始值,一般可以设置元素中的最小值
    //length值表示从起始值上浮多少,一般可以用最大值减去最小值的结果
    
    CPTXYPlotSpace
    *plotSpace = (CPTXYPlotSpace *) scatterPlot.plotSpace;
    
    plotSpace.xRange= [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0) length:CPTDecimalFromFloat([_dataArray count]-1)];
    
    plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0) length:CPTDecimalFromFloat(20)];
    
    //  每个折点用图片和文字展示具体数值  CPTTradingRangePlot
    /**
     CPTMutableLineStyle *whiteLineStyle = [CPTMutableLineStyle lineStyle]; whiteLineStyle.lineColor = [CPTColor whiteColor]; whiteLineStyle.lineWidth = 2.0;
     
     CPTTradingRangePlot *ohlcPlot = [[CPTTradingRangePlot alloc] initWithFrame:graph.bounds];
     
     ohlcPlot.identifier = @"OHLC";
     
     ohlcPlot.lineStyle = whiteLineStyle; //向上或向下的线条
     
     ohlcPlot.plotStyle = CPTTradingRangePlotStyleCandleStick;
     //ohlcPlot.shadow = whiteShadow;
     
     // ohlcPlot.labelShadow = whiteShadow;
     
     [graph addPlot:ohlcPlot];

     
     */
}
#pragma mark - CPTPlotDataSource
//询问有多少个数据
- (NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot {
    return [_dataArray count];
}

// 询问一个个数据值, 在CPTPlotDataSource中声明的
- (NSNumber *)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)idx {
    if (fieldEnum == CPTScatterPlotFieldY) {  // 询问 Y值时
        return [_dataArray objectAtIndex:idx];
    }else {
        return [NSNumber numberWithInt:(int)idx];
    }
}

// 返回每个折点的y轴  数据
-(CPTLayer *)dataLabelForPlot:(CPTPlot *)plot recordIndex:(NSUInteger)index {
    NSLog(@"%lu",(unsigned long)index);
    if (index == 0 || index == (_dataArray.count - 1)) {  // 去除 第一个  和最后一个 y轴数据
        CPTTextLayer *label = [[CPTTextLayer alloc]initWithText:@""];
        CPTMutableTextStyle *text = [ label.textStyle mutableCopy];
        text.color = [CPTColor whiteColor];
        return label;
    }else{
        CPTTextLayer *label = [[CPTTextLayer alloc]initWithText:[NSString stringWithFormat:@"%@",_dataArray[index]]];
        CPTMutableTextStyle *text = [ label.textStyle mutableCopy];
        text.color = [CPTColor whiteColor];
        return label;
    }
 }


绘制曲线图,代码如下:

#import "ViewController.h"
#import "CorePlot-CocoaTouch.h"

@interface ViewController ()<CPTPlotSpaceDelegate,CALayerDelegate,CPTPlotDataSource> {
    NSArray * _coordunatesX;
    NSArray * _coordunatesY;
}
@property (nonatomic, strong) NSMutableArray *dataSource;
@property (nonatomic, strong) CPTGraphHostingView *hostView;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
   
    [self config];
    // 加载数据
    [self initSetData];
    // 创建宿主HostView
    [self initSetupUI];
    // 创建图表,用于显示的画布
    [self createGraph];
    //  创建绘图空间
    [self createPlotSpace];
    // 创建坐标
    [self createAxis];
    //创建平面图,折线图
    [self createPlots];
    // 创建图例
    [self createLegend];
}

#pragma mark - 自定义方法
- (void)config {
    
}

- (void)initSetData {
    for (int i = 0; i < 10; i++) {
        [self.dataSource addObject:[NSNumber numberWithInt:arc4random() %10]];
    }
    
    _coordunatesX = @[@"第1次",@"第2次",@"第3次",@"第4次",@"第5次",@"第6次",@"第7次",@"第8次",@"第9次",@"第10次"];
    _coordunatesY = @[@"0",@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9",@"10"];
}

#pragma mark - 创建宿主HostView
- (void)initSetupUI {
     //  图形要放在CPTGraphHostingView宿主中,因为UIView无法加载CPTGraph
    _hostView = [[CPTGraphHostingView alloc] initWithFrame:self.view.bounds];
    //  默认值:NO,设置为YES可以减少GPU的使用,但是渲染图形的时候会变慢
    _hostView.collapsesLayers = NO;
    //  允许捏合缩放 默认值:YES
    _hostView.allowPinchScaling = NO;
    //  背景色 默认值:clearColor
    _hostView.backgroundColor = [UIColor whiteColor];
    
    // 添加到View中
    [self.view addSubview:_hostView];
}

#pragma mark - 创建图表,用于显示的画布
- (void)createGraph {
    // 基于xy轴的图表创建
    CPTXYGraph *graph=[[CPTXYGraph alloc] initWithFrame:_hostView.bounds];
    // 使宿主视图的hostedGraph与CPTGraph关联
    _hostView.hostedGraph = graph;
    
    // 设置主题, 类似于 皮肤
    /**
     kCPTDarkGradientTheme、
     kCPTPlainBlackTheme、
     kCPTPlainWhiteTheme、
     kCPTSlateTheme、
     kCPTStocksTheme
     */
    CPTTheme *theme = [CPTTheme themeNamed:kCPTSlateTheme];
    [graph applyTheme:theme];
    
    // 标题设置
    graph.title = @"标题:曲线图";
    // 标题对齐于图框的位置,可以用CPTRectAnchor枚举类型,指定标题向图框的4角、4边(中点)对齐标题位置 默认值:CPTRectAnchorTop(顶部居中)
    graph.titlePlotAreaFrameAnchor = CPTRectAnchorTop;
    // 标题对齐时的偏移距离(相对于titlePlotAreaFrameAnchor的偏移距离)默认值:CGPointZero
    graph.titleDisplacement = CGPointZero;
    // 标题文本样式 默认值:nil
    CPTMutableTextStyle *textStyle = [[CPTMutableTextStyle alloc] init];
    textStyle.fontSize = CPTFloat(25);
    textStyle.textAlignment = CPTTextAlignmentLeft;
    graph.titleTextStyle = textStyle;
    
    // CPGGraph内边距,默认值:20.0f
    graph.paddingLeft = CPTFloat(0);
    graph.paddingTop = CPTFloat(0);
    graph.paddingRight = CPTFloat(0);
    graph.paddingBottom = CPTFloat(0);
    
    // CPTPlotAreaFrame绘图区域设置
    // 内边距设置,默认值:0.0f
    graph.plotAreaFrame.paddingLeft = CPTFloat(0);
    graph.plotAreaFrame.paddingTop = CPTFloat(0);
    graph.plotAreaFrame.paddingRight = CPTFloat(0);
    graph.plotAreaFrame.paddingBottom = CPTFloat(0);
    // 边框样式设置 默认值:nil
    graph.plotAreaFrame.borderLineStyle=nil;
}

#pragma mark - 创建绘图空间
- (void)createPlotSpace {
    CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)_hostView.hostedGraph.defaultPlotSpace;
    // 绘图空间是否允许与用户交互 默认值:NO
    plotSpace.allowsUserInteraction = YES;
    // 委托事件
    plotSpace.delegate = self;
    
    // 开启用户交互
     plotSpace.allowsUserInteraction = YES;
    
    // 可显示大小 一屏内横轴/纵轴的显示范围
    // 横轴
    // location表示坐标的显示起始值,length表示要显示的长度 类似于NSRange
    CPTMutablePlotRange *xRange = [CPTMutablePlotRange plotRangeWithLocation:CPTDecimalFromCGFloat(-1) length:CPTDecimalFromCGFloat(_coordunatesX.count + 1)];
    // 横轴显示的收缩/扩大范围 1:不改变  <1:收缩范围  >1:扩大范围
    [xRange expandRangeByFactor:CPTDecimalFromCGFloat(1)];
    
    plotSpace.xRange = xRange;
    
    // 纵轴
    CPTMutablePlotRange *yRange = [CPTMutablePlotRange plotRangeWithLocation:CPTDecimalFromCGFloat(-1) length:CPTDecimalFromCGFloat(11)];
    [yRange expandRangeByFactor:CPTDecimalFromCGFloat(1)];
    
    plotSpace.yRange = yRange;
    
    
    // 绘图空间的最大显示空间,滚动范围
    CPTMutablePlotRange *xGlobalRange = [CPTMutablePlotRange plotRangeWithLocation:CPTDecimalFromCGFloat(-2) length:CPTDecimalFromCGFloat(_coordunatesX.count + 5)];
    
    CPTMutablePlotRange *yGlobalRange = [CPTMutablePlotRange plotRangeWithLocation:CPTDecimalFromCGFloat(-2) length:CPTDecimalFromCGFloat(16)];
    
    plotSpace.globalXRange = xGlobalRange;
    plotSpace.globalYRange = yGlobalRange;
    
}

#pragma mark - 创建坐标
- (void)createAxis {
    // 轴线样式
    CPTMutableLineStyle *axisLineStyle = [[CPTMutableLineStyle alloc] init];
    axisLineStyle.lineWidth = CPTFloat(1);
    axisLineStyle.lineColor = [CPTColor blackColor];
    
    // 标题样式
    CPTMutableTextStyle *titelStyle = [CPTMutableTextStyle textStyle];
    titelStyle.color = [CPTColor redColor];
    titelStyle.fontSize = CPTFloat(20);
    
    // 主刻度线样式
    CPTMutableLineStyle *majorLineStyle = [CPTMutableLineStyle lineStyle];
    majorLineStyle.lineColor = [CPTColor purpleColor];
    
    // 细分刻度线样式
    CPTMutableLineStyle *minorLineStyle = [CPTMutableLineStyle lineStyle];
    minorLineStyle.lineColor = [CPTColor blueColor];
    
    // 轴标签样式
    CPTMutableTextStyle *axisTextStyle = [[CPTMutableTextStyle alloc] init];
    axisTextStyle.color = [CPTColor blueColor];
    axisTextStyle.fontName = @"Helvetica-Bold";
    axisTextStyle.fontSize = CPTFloat(11);
    
    // 轴标签样式
    CPTMutableTextStyle *axisLabelTextStyle = [[CPTMutableTextStyle alloc] init];
    axisLabelTextStyle.color=[CPTColor greenColor];
    axisLabelTextStyle.fontSize = CPTFloat(17);
    
    // 坐标系
    CPTXYAxisSet *axis = (CPTXYAxisSet *)_hostView.hostedGraph.axisSet;
    
     //X轴设置
    
    // 获取X轴线
    CPTXYAxis *xAxis = axis.xAxis;
    
    // 轴线设置
    xAxis.axisLineStyle = axisLineStyle;
    
    // 显示的刻度范围 默认值:nil
    xAxis.visibleRange=[CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0) length:CPTDecimalFromFloat(_coordunatesX.count - 1)];
    
     // 标题设置
    xAxis.title =@ "X轴";
    // 文本样式
    xAxis.titleTextStyle = titelStyle;
    // 位置 与刻度有关,
    xAxis.titleLocation = CPTDecimalFromFloat(2);
    // 方向设置
    xAxis.tickDirection = CPTSignNegative;
    // 偏移量,在方向上的偏移量
    xAxis.titleOffset = CPTFloat(25);
    
     // 位置设置
    
    // 固定坐标 默认值:nil
    //xAxis.axisConstraints = [CPTConstraints constraintWithLowerOffset:50.0];
    // 坐标原点所在位置,默认值:CPTDecimalFromInteger(0)(在Y轴的0点位置)
    xAxis.orthogonalCoordinateDecimal = CPTDecimalFromFloat(0);
    
    
    // 主刻度线设置
    // X轴大刻度线,线型设置
    xAxis.majorTickLineStyle = majorLineStyle;
    // 刻度线的长度
    xAxis.majorTickLength = CPTFloat(5);
    // 刻度线位置
    NSMutableSet *majorTickLocations =[NSMutableSet setWithCapacity:_coordunatesX.count];
    for (int i= 0 ;i< _coordunatesX.count ;i++) {
        [majorTickLocations addObject:[NSNumber numberWithInt:(i)]];
    }
    xAxis.majorTickLocations = majorTickLocations;
    
    // 细分刻度线设置
    // 刻度线的长度
    xAxis.minorTickLength = CPTFloat(3);
    // 刻度线样式
    xAxis.minorTickLineStyle = minorLineStyle;
    // 刻度线位置
    NSInteger minorTicksPerInterval = 3;
    CGFloat minorIntervalLength = CPTFloat(1) / CPTFloat(minorTicksPerInterval + 1);
    NSMutableSet *minorTickLocations =[NSMutableSet setWithCapacity:(_coordunatesX.count - 1) * minorTicksPerInterval];
    for (int i= 0 ;i< _coordunatesX.count - 1;i++) {
        for (int j = 0; j < minorTicksPerInterval; j++) {
            [minorTickLocations addObject:[NSNumber numberWithFloat:(i + minorIntervalLength * (j + 1))]];
        }
    }
    xAxis.minorTickLocations = minorTickLocations;
    
    // 网格线设置
    //xAxis.majorGridLineStyle = majorLineStyle;
    //xAxis.minorGridLineStyle = minorLineStyle;
    //xAxis.gridLinesRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0) length:CPTDecimalFromFloat(9)];
    
     // 轴标签设置
    //清除默认的方案,使用自定义的轴标签、刻度线;
    xAxis.labelingPolicy = CPTAxisLabelingPolicyNone;
    // 轴标签偏移量
    xAxis.labelOffset = 0.f;
    // 轴标签样式
    xAxis.labelTextStyle = axisTextStyle;
    
    // 存放x轴自定义的轴标签
    NSMutableSet *xAxisLabels = [NSMutableSet setWithCapacity:_coordunatesX.count];
    for ( int i= 0 ;i< _coordunatesX.count ;i++) {
        CPTAxisLabel *newLabel = [[CPTAxisLabel alloc] initWithText:_coordunatesX[i] textStyle:axisLabelTextStyle];
        // 刻度线的位置
        newLabel.tickLocation = CPTDecimalFromInt(i);
        newLabel.offset = xAxis.labelOffset + xAxis.majorTickLength;
        newLabel.rotation = M_PI_4;
        [xAxisLabels addObject :newLabel];
    }
    xAxis.axisLabels = xAxisLabels;
    
     //Y轴设置
    // 获取Y轴坐标
    CPTXYAxis *yAxis = axis.yAxis;
    
    // 委托事件
    yAxis.delegate = self;
    
    //轴线样式
    yAxis.axisLineStyle = axisLineStyle;
    
    //显示的刻度
    yAxis.visibleRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.0f) length:CPTDecimalFromFloat(9)];
    
    // 存放x轴自定义的轴标签
    NSMutableSet *yAxisLabels = [NSMutableSet setWithCapacity:_coordunatesY.count];
    for ( int i= 0 ;i< _coordunatesY.count ;i++) {
        CPTAxisLabel *newLabel = [[CPTAxisLabel alloc] initWithText:_coordunatesY[i] textStyle:axisLabelTextStyle];
        // 刻度线的位置
        newLabel.tickLocation = CPTDecimalFromInt(i);
        newLabel.offset = yAxis.labelOffset + yAxis.majorTickLength;
        //newLabel.rotation = M_PI_4;
        [yAxisLabels addObject :newLabel];
    }
    yAxis.axisLabels = yAxisLabels;
    
    // 标题设置
    
    yAxis.title = @"Y轴";
    // 文本样式
    yAxis.titleTextStyle = titelStyle;
    // 位置 与刻度有关,
    yAxis.titleLocation = CPTDecimalFromFloat(2.4);
    // 方向设置
    yAxis.tickDirection = CPTSignNegative;
    // 偏移量,在方向上的偏移量
    yAxis.titleOffset = CPTFloat(18);
    // 旋转方向
    yAxis.titleRotation = CPTFloat(M_PI_2);
    
    // 位置设置
    // 获取X轴原点即0点的坐标
    CGPoint zeroPoint = [xAxis viewPointForCoordinateDecimalNumber:CPTDecimalFromFloat(0)];
    
    // 固定坐标 默认值:nil
    yAxis.axisConstraints = [CPTConstraints constraintWithLowerOffset:CPTFloat(zeroPoint.x)];
    
    // 坐标原点所在位置,默认值:CPTDecimalFromInteger(0)(在X轴的0点位置)
    //yAxis.orthogonalCoordinateDecimal = CPTDecimalFromFloat(0);
    
    
   // 主刻度线设置
    // 显示数字标签的量度间隔
    yAxis.majorIntervalLength = CPTDecimalFromFloat(1);
    // 刻度线,线型设置
    yAxis.majorTickLineStyle = majorLineStyle;
    // 刻度线的长度
    yAxis.majorTickLength = 6;
    
    // 细分刻度线设置
    // 每一个主刻度范围内显示细分刻度的个数
    yAxis.minorTicksPerInterval = 5;
    // 刻度线的长度
    yAxis.minorTickLength = CPTFloat(3);
    // 刻度线,线型设置
    yAxis.minorTickLineStyle = minorLineStyle;
    
    // 网格线设置 默认不显示
    yAxis.majorGridLineStyle = majorLineStyle;
    yAxis.minorGridLineStyle = minorLineStyle;
    yAxis.gridLinesRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0) length:CPTDecimalFromFloat(_coordunatesY.count)];
    
    // 轴标签设置
    // 轴标签偏移量
    yAxis.labelOffset = CPTFloat(5);
    // 轴标签样式
    yAxis.labelTextStyle = axisTextStyle;
    
    // 排除不显示的标签
    NSArray *exclusionRanges = [NSArray arrayWithObjects:
                                [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.99) length:CPTDecimalFromDouble(0.02)],
                                [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(2.99) length:CPTDecimalFromDouble(0.02)],
                                nil];
    yAxis.labelExclusionRanges = exclusionRanges;
    
    // 因为没有清除默认的轴标签(CPTAxisLabelingPolicyNone),如果想要自定义轴标签,需实现委托方法
}

#pragma mark 创建平面图,折线图
- (void)createPlots{
    // 创建折线图
    CPTScatterPlot *scatterPlot = [[CPTScatterPlot alloc] init];
    
    // 添加图形到绘图空间
    [_hostView.hostedGraph addPlot:scatterPlot];
    
    // 标识,根据此@ref identifier来区分不同的plot,也是图例显示名称,
    scatterPlot.identifier = @"scatter";
    
    // 设定数据源,需应用CPTScatterPlotDataSource协议
    scatterPlot.dataSource = self;
    
    // 委托事件
    scatterPlot.delegate = self;
    
    // 线性显示方式设置 默认值:CPTScatterPlotInterpolationLinear(折线图)
    // CPTScatterPlotInterpolationCurved(曲线图)
    // CPTScatterPlotInterpolationStepped/CPTScatterPlotInterpolationHistogram(直方图)
    scatterPlot.interpolation = CPTScatterPlotInterpolationCurved;
    
    
    // 数据标签设置,如果想用自定义的标签,则需要数据源方法:dataLabelForPlot:recordIndex:
    // 偏移量设置
    scatterPlot.labelOffset = 15;
    // 数据标签样式
    CPTMutableTextStyle *labelTextStyle = [[CPTMutableTextStyle alloc] init];
    labelTextStyle.color = [CPTColor magentaColor];
    scatterPlot.labelTextStyle = labelTextStyle;
    
    
    // 线条样式设置
    
    CPTMutableLineStyle * scatterLineStyle = [[ CPTMutableLineStyle alloc ] init];
    scatterLineStyle.lineColor = [CPTColor blackColor];
    scatterLineStyle.lineWidth = 3;
    // 破折线
    scatterLineStyle.dashPattern = @[@(10.0),@(5.0)];
    
    // 如果设置为nil则为散点图
    scatterPlot.dataLineStyle = scatterLineStyle;
    
    // 添加拐点
    // 符号类型:椭圆
    CPTPlotSymbol *plotSymbol = [CPTPlotSymbol ellipsePlotSymbol];
    // 符号大小
    plotSymbol.size = CPTSizeMake(8.0f, 8.f);
    // 符号填充色
    plotSymbol.fill = [CPTFill fillWithColor:[CPTColor whiteColor]];
    // 边框设置
    CPTMutableLineStyle *symboLineStyle = [[ CPTMutableLineStyle alloc ] init];
    symboLineStyle.lineColor = [CPTColor blackColor];
    symboLineStyle.lineWidth = 3;
    plotSymbol.lineStyle = symboLineStyle;
    
    // 向图形上加入符号
    scatterPlot.plotSymbol = plotSymbol;
    
    // 设置拐点的外沿范围,以用来扩大检测手指的触摸范围
    scatterPlot.plotSymbolMarginForHitDetection = CPTFloat(5);
    
    // 创建渐变区
    
    // 创建一个颜色渐变:从渐变色BeginningColor渐变到色endingColor
    CPTGradient *areaGradient = [CPTGradient gradientWithBeginningColor:[CPTColor blueColor] endingColor:[CPTColor clearColor]];
    // 渐变角度:-90 度(顺时针旋转)
    areaGradient.angle = -90.0f ;
    // 创建一个颜色填充:以颜色渐变进行填充
    CPTFill *areaGradientFill = [CPTFill fillWithGradient:areaGradient];
    // 为图形设置渐变区
    scatterPlot.areaFill = areaGradientFill;
    // 渐变区起始值,小于这个值的图形区域不再填充渐变色
    scatterPlot.areaBaseValue = CPTDecimalFromString (@"0.0" );
    
    // 显示动画
    scatterPlot.opacity = 0.0f;
    CABasicAnimation *fadeInAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"];
    fadeInAnimation.duration            = 3.0f;
    fadeInAnimation.removedOnCompletion = NO;
    fadeInAnimation.fillMode            = kCAFillModeForwards;
    fadeInAnimation.toValue             = [NSNumber numberWithFloat:1.0];
    [scatterPlot addAnimation:fadeInAnimation forKey:@"animateOpacity"];
    
}

#pragma mark 创建图例
- (void)createLegend
{
    // 图例样式设置
    NSMutableArray *plots = [NSMutableArray array];
    for (int i = 0; i < _hostView.hostedGraph.allPlots.count; i++) {
        CPTScatterPlot *scatterPlot = _hostView.hostedGraph.allPlots[i];
        
        CPTScatterPlot *plot = [[CPTScatterPlot alloc] init];
        plot.dataLineStyle = scatterPlot.dataLineStyle;
        plot.plotSymbol = scatterPlot.plotSymbol;
        plot.identifier = @"折线图";
        [plots addObject:plot];
    }
    // 图例初始化
    CPTLegend *legend = [CPTLegend legendWithPlots:plots];
    // 图例的列数。有时图例太多,单列显示太长,可分为多列显示
    legend.numberOfColumns = 1;
    // 图例外框的线条样式
    legend.borderLineStyle = nil;
    // 图例的填充属性,CPTFill 类型
    legend.fill = [CPTFill fillWithColor:[CPTColor clearColor]];
    // 图例中每个样本的大小
    legend.swatchSize = CGSizeMake(40, 10);
    // 图例中每个样本的文本样式
    CPTMutableTextStyle *titleTextStyle = [CPTMutableTextStyle textStyle];
    titleTextStyle.color = [CPTColor blackColor];
    titleTextStyle.fontName = @"Helvetica-Bold";
    titleTextStyle.fontSize = 13;
    legend.textStyle = titleTextStyle;
    
    // 把图例于图表关联起来
    _hostView.hostedGraph.legend = legend;
    // 图例对齐于图框的位置,可以用 CPTRectAnchor 枚举类型,指定图例向图框的4角、4边(中点)对齐,默认值:CPTRectAnchorBottom(底部居中)
    _hostView.hostedGraph.legendAnchor = CPTRectAnchorTopRight;
    // 图例对齐时的偏移距离(相对于legendAnchor的偏移距离),默认值:CGPointZeor
    _hostView.hostedGraph.legendDisplacement = CGPointMake(-10, 0);
}

#pragma mark 是否使用系统的轴标签样式 并可改变标签样式 可用于任何标签方案(labelingPolicy)
- (BOOL)axis:(CPTAxis *)axis shouldUpdateAxisLabelsAtLocations:(NSSet *)locations
{
    // 返回NO,使用自定义,返回YES,使用系统的标签
    return NO;
}

#pragma mark - CPTPlotSpace 代理
#pragma mark 替换移动坐标
- (CGPoint)plotSpace:(CPTPlotSpace *)space willDisplaceBy:(CGPoint)proposedDisplacementVector
{
    //    NSLog(@"\n============willDisplaceBy==========\n");
    //    NSLog(@"原始的将要移动的坐标:%@", NSStringFromCGPoint(proposedDisplacementVector));
    //
    return proposedDisplacementVector;
}

#pragma mark 是否允许缩放
- (BOOL)plotSpace:(CPTPlotSpace *)space shouldScaleBy:(CGFloat)interactionScale aboutPoint:(CGPoint)interactionPoint
{
    //    NSLog(@"\n============shouldScaleBy==========\n");
    //    NSLog(@"缩放比例:%lf", interactionScale);
    //    NSLog(@"缩放的中心点:%@", NSStringFromCGPoint(interactionPoint));
    return YES;  
}  

#pragma mark 缩放绘图空间时调用,设置当前显示的大小
- (CPTPlotRange *)plotSpace:(CPTPlotSpace *)space willChangePlotRangeTo:(CPTPlotRange *)newRange forCoordinate:(CPTCoordinate)coordinate
{
    //    NSLog(@"\n============willChangePlotRangeTo==========\n");
    //    NSLog(@"坐标类型:%d", coordinate);
    //    // CPTPlotRange 有比较方法 containsRange:
    //    NSLog(@"原始的坐标空间:location:%@,length:%@", [NSDecimalNumber decimalNumberWithDecimal:newRange.location].stringValue, [NSDecimalNumber decimalNumberWithDecimal:newRange.length].stringValue);
    //
    return newRange;
}

#pragma mark 结束缩放绘图空间时调用
- (void)plotSpace:(CPTPlotSpace *)space didChangePlotRangeForCoordinate:(CPTCoordinate)coordinate
{
    //    NSLog(@"\n============didChangePlotRangeForCoordinate==========\n");
    //    NSLog(@"坐标类型:%d", coordinate);
}

#pragma mark 开始按下 point是在hostedGraph中的坐标
-(BOOL)plotSpace:(CPTPlotSpace *)space shouldHandlePointingDeviceDownEvent:(CPTNativeEvent *)event atPoint:(CGPoint)point
{
    NSLog(@"\n\n\n============shouldHandlePointingDeviceDownEvent==========\n");
    NSLog(@"坐标点:%@", NSStringFromCGPoint(point));
    
    return YES;
}

#pragma mark 开始拖动 point是在hostedGraph中的坐标
-(BOOL)plotSpace:(CPTPlotSpace *)space shouldHandlePointingDeviceDraggedEvent:(CPTNativeEvent *)event atPoint:(CGPoint)point
{
    NSLog(@"\n\n\n============shouldHandlePointingDeviceDraggedEvent==========\n");
    NSLog(@"坐标点:%@", NSStringFromCGPoint(point));
    
    return YES;
}

#pragma mark 松开 point是在hostedGraph中的坐标
-(BOOL)plotSpace:(CPTPlotSpace *)space shouldHandlePointingDeviceUpEvent:(CPTNativeEvent *)event atPoint:(CGPoint)point
{
    NSLog(@"\n\n\n============shouldHandlePointingDeviceUpEvent==========\n");
    NSLog(@"坐标点:%@", NSStringFromCGPoint(point));
    
    return YES;
}

#pragma mark 取消,如:来电时产生的取消事件
-(BOOL)plotSpace:(CPTPlotSpace *)space shouldHandlePointingDeviceCancelledEvent:(CPTNativeEvent *)event
{
    NSLog(@"\n\n\n============shouldHandlePointingDeviceCancelledEvent==========\n");
    
    return YES;
}

#pragma mark - CPTScatterPlot的dataSource方法
#pragma mark 询问有多少个数据
- (NSUInteger) numberOfRecordsForPlot:(CPTPlot *)plot {
    return self.dataSource.count;
}

#pragma mark 询问一个个数据值 fieldEnum:一个轴类型,是一个枚举  idx:坐标轴索引
- (NSNumber *)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)idx
{
    NSNumber *num = nil;
    if(fieldEnum == CPTScatterPlotFieldY){            //询问在Y轴上的值
        num = self.dataSource[idx];
    }else if (fieldEnum == CPTScatterPlotFieldX){     //询问在X轴上的值
        num = @(idx);
    }
    return num;
}

#pragma mark 添加数据标签,在拐点上显示的文本
- (CPTLayer *)dataLabelForPlot:(CPTPlot *)plot recordIndex:(NSUInteger)idx
{
    // 数据标签样式
    CPTMutableTextStyle *labelTextStyle = [[CPTMutableTextStyle alloc] init];
    labelTextStyle.color = [CPTColor magentaColor];
    
    // 定义一个 TextLayer
    CPTTextLayer *newLayer = [[CPTTextLayer alloc] initWithText:[NSString stringWithFormat:@"%ld",(long)[self.dataSource[idx] integerValue]] style:labelTextStyle];
    
    return newLayer;
}

#pragma mark - CPTScatterPlot的delegate方法

- (void)scatterPlot:(CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordIndex:(NSUInteger)idx withEvent:(UIEvent *)event
{
    // 移除注释
    CPTPlotArea *plotArea = _hostView.hostedGraph.plotAreaFrame.plotArea;
    [plotArea removeAllAnnotations];
    
    // 创建拐点注释,plotSpace:绘图空间 anchorPlotPoint:坐标点
    CPTPlotSpaceAnnotation *symbolTextAnnotation = [[CPTPlotSpaceAnnotation alloc] initWithPlotSpace:_hostView.hostedGraph.defaultPlotSpace anchorPlotPoint:@[@(idx),self.dataSource[idx]]];
    
    // 文本样式
    CPTMutableTextStyle *annotationTextStyle = [CPTMutableTextStyle textStyle];
    annotationTextStyle.color = [CPTColor greenColor];
    annotationTextStyle.fontSize = 17.0f;
    annotationTextStyle.fontName = @"Helvetica-Bold";
    // 显示的字符串
    NSString *randomValue = [NSString stringWithFormat:@"折线图\n随即值:%@ \n", [self.dataSource[idx] stringValue]];
    // 注释内容
    CPTTextLayer *textLayer = [[CPTTextLayer alloc] initWithText:randomValue style:annotationTextStyle];
    // 添加注释内容
    symbolTextAnnotation.contentLayer = textLayer;
    
    // 注释位置
    symbolTextAnnotation.displacement = CGPointMake(CPTFloat(0), CPTFloat(20));
    
    // 把拐点注释添加到绘图区域中
    [plotArea addAnnotation:symbolTextAnnotation];
}



#pragma mark -  懒加载
- (NSMutableArray *)dataSource {
    if (!_dataSource) {
        _dataSource = [NSMutableArray arrayWithCapacity:20];
    }
    return _dataSource;
}
@end

填坑,你集成好CorePolt库后, 会出现类似

[CPTMutableNumericData setDataType:]: unrecognized selector sent to instance 0x1edcee60' 这样的错误,因为在使用静态库时候会出现这种链接失效问题, 可以尝试设置Link Flag 为 -all_load -Objc即可.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,302评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,232评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,337评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,977评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,920评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,194评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,638评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,319评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,455评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,379评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,426评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,106评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,696评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,786评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,996评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,467评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,043评论 2 341

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,982评论 4 60
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,280评论 25 707
  • 我是紫君 我的原创 6月2日,江苏扬州,随着2017年高考临近,扬州市蒋王中学为每位备战高考的高三学生,发放了两张...
    昭洁紫君阅读 379评论 0 0
  • 和家人共同成长,和爱人共同成长。和朋友共同成长。和同事共同成长。 为什么要共同成长呢?首先看到别人做到,自己也想要...
    亲爱的吴小仙阅读 219评论 0 1
  • 看惯了秋月春风,才知道什么样的东西是美的,所以我认为人生的阶段就是爬山。 境界低,很多人爬到了山脚,不愿爬,看到的...
    山南有竹阅读 234评论 0 0