这次是最后一篇,这里要说到的是折线图
这里的折线图有两种,一种是断点式的,一种是连续式的,通过设置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;
}
最后上效果图