您的位置:首页 > 其它

如何用Core Plot绘制柱状图

2011-03-01 16:26 381 查看
Core Plot提供了柱状图的绘制,不足的是,只有垂直柱状图,没有提供水平柱状图。期待下一版本的实现。

1、新建Windows-base Application。加入对Core Plot框架的引用。这里我们假设使用了Core
Plot SDK ,项目设置参考前一博文《Core Plot SDK的用法》。

2、新建ViewController,首先修改ViewController的头文件,import
CorePlot.h,同时实现CPPlotDataSource协议,增加一个CPGraph变量:

#import

<UIKit/UIKit.h>

#import

<CorePlot/CorePlot.h>

@interface

BarChartViewController : UIViewController
<CPPlotDataSource>

{

@private

CPXYGraph

*

barChart

;

}

@property

(

readwrite

,

retain

,

nonatomic

) NSTimer *timer;

@end

3、具体实现如下:

-(

void

)viewDidAppear:(

BOOL

)animated

{

//



CPGraph

指定主题

barChart

= [[

CPXYGraph

alloc

]

initWithFrame

:

CGRectZero

];

CPTheme

*theme = [

CPTheme

themeNamed

:

kCPDarkGradientTheme

];

[

barChart

applyTheme

:theme];

//



self.view



UIView

转变为

CPGraphHostingView

,因为

UIView

无法加载

CPGraph

self

.

view

=[[

CPGraphHostingView

alloc ]
initWithFrame :[

UIScreen

mainScreen
]. bounds ];

CPGraphHostingView

*hostingView = (

CPGraphHostingView

*)

self

.

view

;

[hostingView setHostedGraph :

barChart

];

// CPGraph

边框:无

barChart

.

plotAreaFrame

.

borderLineStyle

=

nil

;

barChart

.

plotAreaFrame

.

cornerRadius

=

0.0f

;

// CPGraph

四边不留白

barChart

.

paddingLeft

=

0.0f

;

barChart

.

paddingRight

=

0.0f

;

barChart

.

paddingTop

=

0.0f

;

barChart

.

paddingBottom

=

0.0f

;

//

绘图区

4

边留白

barChart

.

plotAreaFrame

.

paddingLeft

=

70.0

;

barChart

.

plotAreaFrame

.

paddingTop

=

20.0

;

barChart

.

plotAreaFrame

.

paddingRight

=

20.0

;

barChart

.

plotAreaFrame

.

paddingBottom

=

80.0

;

//CPGraph

标题

barChart

.

title

=

@"Graph
Title"

;

//



SDK



CPMutableTextStyle

不可用,用

CPTextStyle

替代

CPTextStyle

*
textStyle=[

CPTextStyle

textStyle

];

//

CPMutableTextStyle
*textStyle = [CPTextStyle textStyle];

textStyle.

color

= [

CPColor

grayColor

];

textStyle.

fontSize

=

16.0f

;

barChart

.

titleTextStyle

=
textStyle;

barChart

.

titleDisplacement

=

CGPointMake

(

0.0f

, -

20.0f

);

barChart

.

titlePlotAreaFrameAnchor

=

CPRectAnchorTop

;

//

绘图空间

plot
space

CPXYPlotSpace

*plotSpace
= (

CPXYPlotSpace

*)

barChart

.

defaultPlotSpace

;

//

绘图空间大小:

Y



0-300



x



0-16

plotSpace.

yRange

= [

CPPlotRange

plotRangeWithLocation

:

CPDecimalFromFloat

(

0.0f

)

length

:

CPDecimalFromFloat

(

300.0f

)];

plotSpace.

xRange

= [

CPPlotRange

plotRangeWithLocation

:

CPDecimalFromFloat

(

0.0f

)

length

:

CPDecimalFromFloat

(

16.0f

)];

//

坐标系

CPXYAxisSet

*axisSet =
(

CPXYAxisSet

*)

barChart

.

axisSet

;

//x

轴:为坐标系的

x



CPXYAxis

*x =
axisSet.

xAxis

;

CPLineStyle

*
lineStyle=[[

CPLineStyle

alloc

]

init

];

lineStyle.

lineColor

=[

CPColor

greenColor

];

lineStyle.

lineWidth

=

1.0f

;

//x

轴:线型设置

x.

axisLineStyle

=
lineStyle;

//

大刻度线:线型设置

x.

majorTickLineStyle

=
lineStyle;

//

大刻度线:长度

x.

majorTickLength

=

10

;

//

小刻度线:无

x.

minorTickLineStyle

=lineStyle;

//

小刻度线:长度

x.

minorTickLength

=

5

;

//

大刻度线间隔单位:

5

个单位

x.

majorIntervalLength

=

CPDecimalFromString

(

@"5"

);

//

直角坐标:

0

x.

orthogonalCoordinateDecimal

=

CPDecimalFromString

(

@"0"

);

//

标题

x.

title

=

@"X
Axis"

;

//

标题位置:

7.5

单位

x.

titleLocation

=

CPDecimalFromFloat

(

7.5f

);

//

向下偏移:

55.0

x.

titleOffset

=

55.0f

;

//y



CPXYAxis

*y =
axisSet.

yAxis

;

//y

轴:线型设置

y.

axisLineStyle

=
lineStyle;

//y

轴:线型设置

y.

majorTickLineStyle

=
lineStyle;

//y

轴:不显示小刻度线

y.

minorTickLineStyle

=

nil

;

//

大刻度线间距:

50

单位

y.

majorIntervalLength

=

CPDecimalFromString

(

@"50"

);

//

坐标原点:

0

y.

orthogonalCoordinateDecimal

=

CPDecimalFromString

(

@"0"

);

//

轴标题

y.

title

=

@"Y
Axis"

;

y.

titleOffset

=

45.0f

;

y.

titleLocation

=

CPDecimalFromFloat

(

150.0f

);

//



1

个柱状图:黑色

CPBarPlot

*barPlot =
[

CPBarPlot

tubularBarPlotWithColor

:[

CPColor

darkGrayColor

]

horizontalBars

:

NO

];

barPlot.

baseValue

=

CPDecimalFromString

(

@"1"

);

//

数据源,必须实现

CPPlotDataSource

协议

barPlot.

dataSource

=

self

;

//

图形向左偏移:

0.25

barPlot.

barOffset

= -

0.25f

;

//id

,根据此

id

来区分不同的

plot

,或者为不同

plot

提供不同数据源

barPlot.

identifier

=

@"Bar
Plot 1"

;

//

添加图形到绘图空间

[

barChart

addPlot

:barPlot

toPlotSpace

:plotSpace];

//



2

个柱状图:蓝色

barPlot = [

CPBarPlot

tubularBarPlotWithColor

:[

CPColor

blueColor

]

horizontalBars

:

NO

];

//

数据源,必须实现

CPPlotDataSource

协议

barPlot.

dataSource

=

self

;

//

柱子的起始基线:即最下沿的

y

坐标

barPlot.

baseValue

=

CPDecimalFromString

(

@"1"

);

//

图形向右偏移:

0.25

barPlot.

barOffset

=

0.25f

;

//



SDK

中,

barCornerRadius



cornerRadius

替代

barPlot.

cornerRadius

=

2.0f

;

//barPlot.barCornerRadius
= 2.0f;

//id

,根据此

id

来区分不同的

plot

,或者为不同

plot

提供不同数据源

barPlot.

identifier

=

@"Bar
Plot 2"

;

//

添加图形到绘图空间

[

barChart

addPlot

:barPlot

toPlotSpace

:plotSpace];

}

- (

void

)didReceiveMemoryWarning
{

[

super

didReceiveMemoryWarning

];

//
Releases the view if it doesn't have a superview

// Release
anything that's not essential, such as cached data

}

#pragma
mark -

#pragma
mark Plot Data Source Methods

//

返回数据源的纪录数

-(

NSUInteger

)numberOfRecordsForPlot:(

CPPlot

*)plot {

return

16

;

}

//

返回数据源的数据

-(

NSNumber

*)numberForPlot:(

CPPlot

*)plot field:(

NSUInteger

)fieldEnum
recordIndex:(

NSUInteger

)index

{

//

返回类型是一个

NSNumber

NSDecimalNumber

*num =

nil

;

//

如果图形类型是



柱状图



if

( [plot

isKindOfClass

:[

CPBarPlot

class

]] ) {

//

根据情况,柱状图的每一点都需要返回两种数据:位置(

x

轴),长度(

y

轴)

switch

( fieldEnum
) {

//x

轴坐标(柱子位置):

case

CPBarPlotFieldBarLocation

:

num = (

NSDecimalNumber

*)[

NSDecimalNumber

numberWithUnsignedInteger

:index];

break

;

//y

轴坐标(柱子长度):

//SDK

中,枚举

CPBarPlotField

只有两个值

CPBarPlotFieldBarLocation
= 2,

或者

CPBarPlotFieldBarLength

= 3

case

CPBarPlotFieldBarLength

:

//case
CPBarPlotFieldBarTip:

num = (

NSDecimalNumber

*)[

NSDecimalNumber

numberWithUnsignedInteger

:(index+

1

)*(index+

1

)];

//

对于第

2

个图形的点的

y

值,在第一个图形的基础上减去

10

if

( [plot.

identifier

isEqual

:

@"Bar
Plot 2"

] )

num = [num

decimalNumberBySubtracting

:[

NSDecimalNumber

decimalNumberWithString

:

@"10"

]];

break

;

}

}

return

num;

}

-(

CPFill

*)
barFillForBarPlot:(

CPBarPlot

*)barPlot
recordIndex:(

NSNumber

*)index;

{

return

nil

;

}

运行效果如下:

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