如何使用Core Plot绘制直方图和折线图

来源:互联网 发布:人事办公软件 编辑:程序博客网 时间:2024/05/19 00:50


 

Core Plot提供了散点图(CPScatterPlot)绘制,包括折线图和直方图,如下图所示:

下面的代码包括了折线图和直方图的实现:

 

1、.h文件:

#import <UIKit/UIKit.h>

#import <CorePlot/CorePlot.h>

// 散点图的数据点数: 20

#define num 20

@interface BarChartViewController : UIViewController <CPPlotDataSource>

{

@private

CPXYGraph * graph ;

double x [ num ] ; // 散点的 x 坐标

    double y1 [ num ] ; //  1 个散点图的 y 坐标

double y2 [ num ]; //  2 个散点图的 y 坐标

}

 

@end

2、.m文件:

#import "BarChartViewController.h"

@implementation BarChartViewController

-( BOOL )shouldAutorotateToInterfaceOrientation:( UIInterfaceOrientation )toInterfaceOrientation

{

return YES ;

}

#pragma mark -

#pragma mark Initialization and teardown

 

-( void )viewDidAppear:( BOOL )animated

{

 

    //  CPGraph 指定主题

    graph = [[ CPXYGraph alloc initWithFrame : CGRectZero ];

CPTheme *theme = [ CPTheme themeNamed : kCPDarkGradientTheme ];

    graph applyTheme :theme];

//  self.view  UIView 转变为 CPGraphHostingView ,因为 UIView 无法加载 CPGraph

self . view =[[ CPGraphHostingView alloc ] initWithFrame :[ UIScreen mainScreen ]. bounds ];

CPGraphHostingView *hostingView = ( CPGraphHostingView *) self . view ;

[hostingView setHostedGraph : graph ];

// CPGraph 边框:无

graph . plotAreaFrame . borderLineStyle nil ;

    graph . plotAreaFrame . cornerRadius 0.0f ;

 

   

// 绘图空间 plot space

    CPXYPlotSpace *plotSpace = ( CPXYPlotSpace *) graph . defaultPlotSpace ;

// 绘图空间大小: Y  0-300  x  0-16

    plotSpace. yRange = [ CPPlotRange plotRangeWithLocation : CPDecimalFromFloat ( 0.0f length :CPDecimalFromFloat ( 200.0f )];

    plotSpace. xRange = [ CPPlotRange plotRangeWithLocation : CPDecimalFromFloat ( 0.0f length :CPDecimalFromInt ( num )];

// CPGraph 四边不留白

    graph . paddingLeft 0.0f ;

    graph . paddingRight 0.0f ;

    graph . paddingTop 0.0f ;

    graph . paddingBottom 0.0f ;

// 绘图区 4 边留白

    graph . plotAreaFrame . paddingLeft 45.0 ;

graph . plotAreaFrame . paddingTop 40.0 ;

graph . plotAreaFrame . paddingRight 5.0 ;

graph . plotAreaFrame . paddingBottom 80.0 ;

   

// 坐标系

CPXYAxisSet *axisSet = ( CPXYAxisSet *) graph . axisSet ;

//x 轴:为坐标系的 x 

    CPXYAxis *X = axisSet. xAxis ;

// 清除默认的轴标签 , 使用自定义的轴标签

X. labelingPolicy = CPAxisLabelingPolicyNone ;

 

// 构造 MutableArray ,用于存放自定义的轴标签

NSMutableArray *customLabels = [ NSMutableArray arrayWithCapacity : num ];

// 构造一个 TextStyle

static CPTextStyle * labelTextStyle= nil ;

labelTextStyle=[[ CPTextStyle alloc ] init ];

labelTextStyle. color =[ CPColor whiteColor ];

labelTextStyle. fontSize = 10.0f ;

// 每个数据点一个轴标签

for ( int i= 0 ;i< num ;i++) {

CPAxisLabel *newLabel = [[ CPAxisLabel alloc initWithText : [ NSString stringWithFormat : @"  %d 个数据点 " ,(i+ 1 )] textStyle :labelTextStyle];

newLabel. tickLocation CPDecimalFromInt (i);

newLabel. offset = X. labelOffset + X. majorTickLength ;

newLabel. rotation M_PI / 2 ;

[customLabels addObject :newLabel];

[newLabel release ];

}

X. axisLabels =  NSSet setWithArray :customLabels];

//y 

CPXYAxis *y = axisSet. yAxis ;

//y 轴:不显示小刻度线

    y. minorTickLineStyle nil ;

// 大刻度线间距: 50 单位

    y. majorIntervalLength CPDecimalFromString ( @"50" );

// 坐标原点: 0

    y. orthogonalCoordinateDecimal CPDecimalFromString ( @"0" );

y. titleOffset 45.0f ;

    y. titleLocation CPDecimalFromFloat ( 150.0f );

//  1 个散点图:蓝色

CPScatterPlot *boundLinePlot = [[[ CPScatterPlot alloc init autorelease ];

//id ,用于识别该散点图

    boundLinePlot. identifier @"Blue Plot" ;

    // 线型设置

    CPLineStyle * lineStyle = [[[ CPLineStyle alloc ] init autorelease ];

lineStyle. lineWidth 1.0f ;

lineStyle. lineColor = [ CPColor blueColor ];

    boundLinePlot. dataLineStyle = lineStyle;

    // 设置数据源 , 必须实现 CPPlotDataSource 协议

    boundLinePlot. dataSource self ;

graph addPlot :boundLinePlot];

// 在图形上添加一些小圆点符号(节点)

CPLineStyle *symbolLineStyle = [[ CPLineStyle alloc ] init ];

// 描边:黑色

symbolLineStyle. lineColor = [ CPColor blackColor ];

// 符号类型:椭圆

CPPlotSymbol *plotSymbol = [ CPPlotSymbol ellipsePlotSymbol ];

// 填充色:蓝色

plotSymbol. fill = [ CPFill fillWithColor :[ CPColor blueColor ]];

// 描边

plotSymbol. lineStyle = symbolLineStyle;

// 符号大小: 10*10

    plotSymbol. size CGSizeMake ( 6.0 6.0 );

// 向图形上加入符号

    boundLinePlot. plotSymbol = plotSymbol;

// 创建渐变区

// 渐变色 1

    CPColor *areaColor = [ CPColor colorWithComponentRed : 0.0 green : 0.0 blue : 1.0 alpha : 1.0 ];

// 创建一个颜色渐变:从 建变色 渐变到 无色

    CPGradient *areaGradient = [ CPGradient gradientWithBeginningColor :areaColor endingColor :[ CPColorclearColor ]];

    // 渐变角度: -90 度(顺时针旋转)

areaGradient. angle = - 90.0f ;

// 创建一个颜色填充:以颜色渐变进行填充

    CPFill *areaGradientFill = [ CPFill fillWithGradient :areaGradient];

// 为图形 1 设置渐变区

    boundLinePlot. areaFill = areaGradientFill;

// 渐变区起始值,小于这个值的图形区域不再填充渐变色

    boundLinePlot. areaBaseValue CPDecimalFromString ( @"0.0" );

//interpolation 值为 CPScatterPlotInterpolation 枚举类型,该枚举有 3 个值:

//CPScatterPlotInterpolationLinear, 线性插补 —— 折线图 .

//CPScatterPlotInterpolationStepped, 在后方进行插补 —— 直方图

//CPScatterPlotInterpolationHistogram, 以散点为中心进行插补 —— 直方图

boundLinePlot. interpolation CPScatterPlotInterpolationHistogram ;

   

    //  2 个散点图:绿色

CPScatterPlot *dataSourceLinePlot = [[[ CPScatterPlot alloc init autorelease ];

    dataSourceLinePlot. identifier @"Green Plot" ;

    // 线型设置

    lineStyle = [[[ CPLineStyle alloc ] init autorelease ];

lineStyle. lineWidth 1.0f ;

    lineStyle. lineColor = [ CPColor greenColor ];

    dataSourceLinePlot. dataLineStyle = lineStyle;

    // 设置数据源 , 必须实现 CPPlotDataSource 协议

    dataSourceLinePlot. dataSource self ;

    graph addPlot :dataSourceLinePlot] ;

    // 随机产生散点数据

    NSUInteger i;

for ( i = 0 ; i < num ; i++ ) {

x [i] = i ;

y1 [i] = ( num * 10 )*( rand ()/( float ) RAND_MAX );

        y2 [i] = ( num * 10 )*( rand ()/( float ) RAND_MAX );

}   

}

#pragma mark -

#pragma mark Plot Data Source Methods

// 返回散点数

-( NSUInteger )numberOfRecordsForPlot:( CPPlot *)plot

{

    return num ;

}

// 根据参数返回数据(一个 C 数组)

- ( double *)doublesForPlot:( CPPlot *)plot field:( NSUInteger )fieldEnum recordIndexRange:( NSRange)indexRange

{

// 返回类型:一个 double 指针(数组)

    double *values;

NSString * identifier=( NSString *)[plot identifier];

 

switch (fieldEnum) {

// 如果请求的数据是散点 x 坐标 , 直接返回 x 坐标(两个图形是一样的),否则还要进一步判断是那个图形

case CPScatterPlotFieldX :

values= x ;

break ;

case CPScatterPlotFieldY :

// 如果请求的数据是散点 y 坐标,则对于图形 1 ,使用 y1 数组,对于图形 2 ,使用 y2 数组

if ([identifier isEqualToString : @"Blue Plot" ]) {

values= y1 ;

else

values= y2 ;

break ;

}

// 数组指针右移个 indexRage.location 单位,则数组截去 indexRage.location 个元素

    return values + indexRange. location ;

}

// 添加数据标签

-( CPLayer *)dataLabelForPlot:( CPPlot *)plot recordIndex:( NSUInteger )index

{

// 定义一个白色的 TextStyle

static CPTextStyle *whiteText = nil ;

if ( !whiteText ) {

whiteText = [[ CPTextStyle alloc init ];

whiteText. color = [ CPColor whiteColor ];

}

// 定义一个 TextLayer

CPTextLayer *newLayer = nil ;

NSString * identifier=( NSString *)[plot identifier];

if ([identifier isEqualToString : @"Blue Plot" ]) {

newLayer = [[[ CPTextLayer alloc initWithText :[ NSString stringWithFormat : @"%.0f" y1 [index]] style:whiteText] autorelease ];

}

return newLayer;

}

@end


原文地址:http://blog.csdn.net/kmyhy/article/details/6217683