您的位置:首页 > 其它

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

2011-03-02 11:50 447 查看
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

];

//

创建一个颜色渐变:从

建变色

1

渐变到

无色

CPGradient

*areaGradient = [

CPGradient

gradientWithBeginningColor

:areaColor

endingColor

:[

CPColor

clearColor

]];

//

渐变角度:

-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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: