利用Core Plot绘制折线图

来源:互联网 发布:ubuntu查看显卡状态 编辑:程序博客网 时间:2024/06/04 19:03

这次是最后一篇,这里要说到的是折线图

这里的折线图有两种,一种是断点式的,一种是连续式的,通过设置dashpattern这个数组来进行区分

还有就是设置颜色渐变,通过CPTGradient,话不多说,直接上代码

-(void)createView{    //创建图表    CPTXYGraph *newGraph = [[CPTXYGraph alloc] initWithFrame:CGRectZero];    //主题    CPTTheme *theme = [CPTTheme themeNamed:kCPTDarkGradientTheme];    [newGraph applyTheme:theme];        //画布    CPTGraphHostingView *scatterPlotView = [[CPTGraphHostingView alloc] initWithFrame:self.view.frame];    scatterPlotView.hostedGraph = newGraph;    [self.view addSubview:scatterPlotView];        //设置图表距离边框的大小    newGraph.paddingLeft   = 10.0;    newGraph.paddingTop    = 10.0;    newGraph.paddingRight  = 10.0;    newGraph.paddingBottom = 10.0;        //设置xy轴的范围    CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)newGraph.defaultPlotSpace;    plotSpace.allowsUserInteraction = YES;    plotSpace.xRange                = [CPTPlotRange plotRangeWithLocation:@1.0 length:@2.0];    plotSpace.yRange                = [CPTPlotRange plotRangeWithLocation:@1.0 length:@3.0];        //设置x轴的信息    CPTXYAxisSet *axisSet = (CPTXYAxisSet *)newGraph.axisSet;    CPTXYAxis *x          = axisSet.xAxis;    //主刻度间隔为0.5    x.majorIntervalLength   = @0.5;    //设置x轴原点    x.orthogonalPosition    = @2.0;    x.minorTicksPerInterval = 2;    //设置x轴上不需要显示的刻度    CPTPlotRangeArray exclusionRanges = @[[CPTPlotRange plotRangeWithLocation:@1.99 length:@0.02],                                          [CPTPlotRange plotRangeWithLocation:@0.99 length:@0.02],                                          [CPTPlotRange plotRangeWithLocation:@2.99 length:@0.02]];    x.labelExclusionRanges = exclusionRanges;        CPTXYAxis *y = axisSet.yAxis;    y.majorIntervalLength   = @0.5;    y.minorTicksPerInterval = 5;    y.orthogonalPosition    = @2.0;    exclusionRanges         = @[[CPTPlotRange plotRangeWithLocation:@1.99 length:@0.02],                                [CPTPlotRange plotRangeWithLocation:@0.99 length:@0.02],                                [CPTPlotRange plotRangeWithLocation:@3.99 length:@0.02]];    y.labelExclusionRanges = exclusionRanges;        // Create a green plot area    // 绿色显示线条    CPTScatterPlot *dataSourceLinePlot = [[CPTScatterPlot alloc] init];    dataSourceLinePlot.identifier = @"Green Plot";        CPTMutableLineStyle *lineStyle = [dataSourceLinePlot.dataLineStyle mutableCopy];    lineStyle.lineWidth              = 3.0;    lineStyle.lineColor              = [CPTColor greenColor];    //设置虚线, 代表着样式,这里的值是一个数组    lineStyle.dashPattern            = @[@35.0f, @5.0f];    dataSourceLinePlot.dataLineStyle = lineStyle;        dataSourceLinePlot.dataSource = self;        // Put an area gradient under the plot above    //绿色渐变区域    CPTColor *areaColor       = [CPTColor colorWithComponentRed:CPTFloat(0.3) green:CPTFloat(1.0) blue:CPTFloat(0.3) alpha:CPTFloat(0.8)];    CPTGradient *areaGradient = [CPTGradient gradientWithBeginningColor:areaColor endingColor:[CPTColor clearColor]];    areaGradient.angle = -90.0;    CPTFill *areaGradientFill = [CPTFill fillWithGradient:areaGradient];    dataSourceLinePlot.areaFill      = areaGradientFill;    dataSourceLinePlot.areaBaseValue = @1.75;        // Animate in the new plot, as an example    dataSourceLinePlot.opacity        = 0.0;    dataSourceLinePlot.cachePrecision = CPTPlotCachePrecisionDecimal;    [newGraph addPlot:dataSourceLinePlot];        //显示淡入签出动画动画    CABasicAnimation *fadeInAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"];    fadeInAnimation.duration            = 1.0;    fadeInAnimation.removedOnCompletion = NO;    fadeInAnimation.fillMode            = kCAFillModeForwards;    fadeInAnimation.toValue             = @1.0;    [dataSourceLinePlot addAnimation:fadeInAnimation forKey:@"animateOpacity"];        // Create a blue plot area    //蓝色线条    CPTScatterPlot *boundLinePlot = [[CPTScatterPlot alloc] init];    boundLinePlot.identifier = @"Blue Plot";        lineStyle            = [boundLinePlot.dataLineStyle mutableCopy];    lineStyle.miterLimit = 1.0;    lineStyle.lineWidth  = 3.0;    lineStyle.lineColor  = [CPTColor blueColor];        boundLinePlot.dataSource     = self;    boundLinePlot.cachePrecision = CPTPlotCachePrecisionDouble;    boundLinePlot.interpolation  = CPTScatterPlotInterpolationHistogram;    [newGraph addPlot:boundLinePlot];        // Do a blue gradient    //蓝色渐变区域    CPTColor *areaColor1       = [CPTColor colorWithComponentRed:CPTFloat(0.3) green:CPTFloat(0.3) blue:CPTFloat(1.0) alpha:CPTFloat(0.8)];    CPTGradient *areaGradient1 = [CPTGradient gradientWithBeginningColor:areaColor1 endingColor:[CPTColor clearColor]];    areaGradient1.angle         = -90.0;    areaGradientFill            = [CPTFill fillWithGradient:areaGradient1];    boundLinePlot.areaFill      = areaGradientFill;    boundLinePlot.areaBaseValue = @0.0;        // Add plot symbols    //设置线条的样式    CPTMutableLineStyle *symbolLineStyle = [CPTMutableLineStyle lineStyle];    symbolLineStyle.lineColor = [CPTColor redColor];    //设置关键点的样式,是圆圈还是什么乱七八糟的东东    CPTPlotSymbol *plotSymbol = [CPTPlotSymbol ellipsePlotSymbol];    //设置原点内部的颜色    plotSymbol.fill          = [CPTFill fillWithColor:[CPTColor whiteColor]];    plotSymbol.lineStyle     = symbolLineStyle;    plotSymbol.size          = CGSizeMake(10.0, 10.0);    boundLinePlot.plotSymbol = plotSymbol;        // Add some initial data    //设置数据    NSMutableArray<NSDictionary *> *contentArray = [NSMutableArray arrayWithCapacity:100];    for ( NSUInteger i = 0; i < 60; i++ ) {        NSNumber *xVal = @(1 + i * 0.05);        NSNumber *yVal = @(1.2 * arc4random() / (double)UINT32_MAX + 1.2);        [contentArray addObject:@{ @"x": xVal, @"y": yVal }];    }    self.dataForPlot = contentArray;}
设置数据源方法

#pragma mark DataSource-(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot{    return self.dataForPlot.count;}-(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index{    NSNumber *num = nil;    if ( index % 8 ) {        NSString *key = (fieldEnum == CPTScatterPlotFieldX ? @"x" : @"y");        num = self.dataForPlot[index][key];        // Green plot gets shifted above the blue        if ( [(NSString *)plot.identifier isEqualToString : @"Green Plot"] ) {            if ( fieldEnum == CPTScatterPlotFieldY ) {                num = @([num doubleValue] + 1.0);            }        }    }    else {        num = @(NAN);    }    return num;}-(CPTLayer *)dataLabelForPlot:(CPTPlot *)plot recordIndex:(NSUInteger)idx{    static CPTMutableTextStyle *whiteText = nil;    static dispatch_once_t onceToken;    dispatch_once(&onceToken, ^{        whiteText = [[CPTMutableTextStyle alloc] init];        whiteText.color = [CPTColor whiteColor];    });        CPTTextLayer *newLayer = nil;    newLayer = [[CPTTextLayer alloc] initWithText:[NSString stringWithFormat:@"%lu",(unsigned long)idx] style:whiteText];    return newLayer;}

最后上效果图


0 0
原创粉丝点击