//
|
// PCChartViewController.m
|
// PNChartDemo
|
//
|
// Created by kevin on 11/7/13.
|
// Copyright (c) 2013年 kevinzhow. All rights reserved.
|
//
|
|
#import "PCChartViewController.h"
|
|
#define ARC4RANDOM_MAX 0x100000000
|
|
@implementation PCChartViewController
|
|
|
- (void)viewDidLoad
|
{
|
[super viewDidLoad];
|
self.titleLabel.textColor = PNFreshGreen;
|
self.leftSwitch.hidden = YES;
|
self.rightSwitch.hidden = YES;
|
self.leftLabel.hidden = YES;
|
self.rightLabel.hidden = YES;
|
self.centerSwitch.hidden = YES;
|
self.centerSwitchLabel.hidden = YES;
|
|
self.changeValueButton.hidden = YES;
|
|
if ([self.title isEqualToString:@"Line Chart"])
|
{
|
|
self.titleLabel.text = @"Line Chart";
|
|
self.rightSwitch.hidden = NO;
|
self.rightLabel.hidden = NO;
|
self.leftSwitch.hidden = NO;
|
self.leftLabel.hidden = NO;
|
self.animationsSwitch.hidden = NO;
|
|
self.leftLabel.text = @"Dark Background";
|
self.rightLabel.text = @"Show Curved Lines";
|
|
self.animationsSwitch.enabled = YES;
|
self.rightSwitch.enabled = YES;
|
self.leftSwitch.enabled = YES;
|
[self.animationsSwitch setOn:NO];
|
[self.rightSwitch setOn:NO];
|
[self.leftSwitch setOn:NO];
|
|
|
self.lineChart.backgroundColor = [UIColor whiteColor];
|
self.lineChart.yGridLinesColor = [UIColor grayColor];
|
[self.lineChart.chartData enumerateObjectsUsingBlock:^(PNLineChartData *obj, NSUInteger idx, BOOL *stop) {
|
obj.pointLabelColor = [UIColor blackColor];
|
}];
|
|
self.lineChart = [[PNLineChart alloc] initWithFrame:CGRectMake(0, 135.0, SCREEN_WIDTH, 200.0)];
|
self.lineChart.showCoordinateAxis = YES; // 是否显示坐标轴
|
self.lineChart.yLabelFormat = @"%1.1f"; //在Y轴标签float值字符串格式化
|
self.lineChart.xLabelFont = [UIFont fontWithName:@"Helvetica-Light" size:8.0];
|
[self.lineChart setXLabels:@[@"SEP 1", @"SEP 2", @"SEP 3", @"SEP 4", @"SEP 5", @"SEP 6", @"SEP 7"]];
|
self.lineChart.yLabelColor = [UIColor blackColor];
|
self.lineChart.xLabelColor = [UIColor blackColor];
|
|
// added an example to show how yGridLines can be enabled
|
// the color is set to clearColor so that the demo remains the same
|
self.lineChart.showGenYLabels = NO;
|
self.lineChart.showYGridLines = YES;
|
|
//Use yFixedValueMax and yFixedValueMin to Fix the Max and Min Y Value
|
//Only if you needed
|
self.lineChart.yFixedValueMax = 300.0;
|
self.lineChart.yFixedValueMin = 0.0;
|
|
self.lineChart.showSmoothLines = YES;
|
|
[self.lineChart setYLabels:@[
|
@"0",
|
@"50",
|
@"100",
|
@"150",
|
@"200",
|
@"250",
|
@"300",
|
]
|
];
|
|
// // Line Chart #1
|
// NSArray *data01Array = @[@15.1, @60.1, @110.4, @10.0, @186.2, @197.2, @276.2];
|
// data01Array = [[data01Array reverseObjectEnumerator] allObjects];
|
// PNLineChartData *data01 = [PNLineChartData new];
|
//
|
// data01.rangeColors = @[
|
// [[PNLineChartColorRange alloc] initWithRange:NSMakeRange(10, 30) color:[UIColor redColor]],
|
// [[PNLineChartColorRange alloc] initWithRange:NSMakeRange(100, 200) color:[UIColor purpleColor]]
|
// ];
|
// data01.dataTitle = @"Alpha";
|
// data01.color = PNFreshGreen;
|
// data01.pointLabelColor = [UIColor blackColor];
|
// data01.alpha = 0.3f;
|
// data01.showPointLabel = YES;
|
// data01.pointLabelFont = [UIFont fontWithName:@"Helvetica-Light" size:9.0];
|
// data01.itemCount = data01Array.count;
|
// data01.inflexionPointColor = PNRed;
|
// data01.inflexionPointStyle = PNLineChartPointStyleTriangle;
|
// data01.getData = ^(NSUInteger index) {
|
// CGFloat yValue = [data01Array[index] floatValue];
|
// return [PNLineChartDataItem dataItemWithY:yValue];
|
// };
|
|
// Line Chart #2
|
NSArray *data02Array = @[@0.0, @180.1, @26.4, @202.2, @126.2, @167.2, @276.2];
|
PNLineChartData *data02 = [PNLineChartData new];
|
data02.dataTitle = @"Beta";
|
data02.pointLabelColor = [UIColor blackColor];
|
data02.color = PNTwitterColor;
|
data02.alpha = 0.5f;
|
data02.itemCount = data02Array.count;
|
data02.inflexionPointStyle = PNLineChartPointStyleCircle;
|
data02.getData = ^(NSUInteger index)
|
{
|
CGFloat yValue = [data02Array[index] floatValue];
|
return [PNLineChartDataItem dataItemWithY:yValue];
|
};
|
|
//self.lineChart.chartData = @[data01, data02];
|
self.lineChart.chartData = @[data02];
|
[self.lineChart.chartData enumerateObjectsUsingBlock:^(PNLineChartData *obj, NSUInteger idx, BOOL *stop)
|
{
|
obj.pointLabelColor = [UIColor blackColor];
|
}];
|
|
|
[self.lineChart strokeChart];
|
self.lineChart.delegate = self;
|
|
|
[self.view addSubview:self.lineChart];
|
|
self.lineChart.legendStyle = PNLegendItemStyleStacked;
|
self.lineChart.legendFont = [UIFont boldSystemFontOfSize:12.0f];
|
self.lineChart.legendFontColor = [UIColor redColor];
|
|
UIView *legend = [self.lineChart getLegendWithMaxWidth:320];
|
[legend setFrame:CGRectMake(30, 340, legend.frame.size.width, legend.frame.size.width)];
|
[self.view addSubview:legend];
|
}
|
else if ([self.title isEqualToString:@"Bar Chart"])
|
{
|
static NSNumberFormatter *barChartFormatter;
|
if (!barChartFormatter) {
|
barChartFormatter = [[NSNumberFormatter alloc] init];
|
barChartFormatter.numberStyle = NSNumberFormatterCurrencyStyle;
|
barChartFormatter.allowsFloats = NO;
|
barChartFormatter.maximumFractionDigits = 0;
|
}
|
self.titleLabel.text = @"Bar Chart";
|
|
self.barChart = [[PNBarChart alloc] initWithFrame:CGRectMake(0, 135.0, SCREEN_WIDTH, 200.0)];
|
// self.barChart.showLabel = NO;
|
self.barChart.yLabelFormatter = ^(CGFloat yValue) {
|
return [barChartFormatter stringFromNumber:@(yValue)];
|
};
|
|
self.barChart.yChartLabelWidth = 20.0;
|
self.barChart.chartMarginLeft = 30.0;
|
self.barChart.chartMarginRight = 10.0;
|
self.barChart.chartMarginTop = 5.0;
|
self.barChart.chartMarginBottom = 10.0;
|
|
|
self.barChart.labelMarginTop = 5.0;
|
self.barChart.showChartBorder = YES;
|
[self.barChart setXLabels:@[@"2", @"3", @"4", @"5", @"2", @"3", @"4", @"5"]];
|
// self.barChart.yLabels = @[@-10,@0,@10];
|
// [self.barChart setYValues:@[@10000.0,@30000.0,@10000.0,@100000.0,@500000.0,@1000000.0,@1150000.0,@2150000.0]];
|
[self.barChart setYValues:@[@10.82, @1.88, @6.96, @33.93, @10.82, @1.88, @6.96, @33.93]];
|
[self.barChart setStrokeColors:@[PNGreen, PNGreen, PNRed, PNGreen, PNGreen, PNGreen, PNRed, PNGreen]];
|
self.barChart.isGradientShow = NO;
|
self.barChart.isShowNumbers = NO;
|
|
[self.barChart strokeChart];
|
|
self.barChart.delegate = self;
|
|
[self.view addSubview:self.barChart];
|
} else if ([self.title isEqualToString:@"Circle Chart"]) {
|
self.titleLabel.text = @"Circle Chart";
|
|
|
self.circleChart = [[PNCircleChart alloc] initWithFrame:CGRectMake(0, 150.0, SCREEN_WIDTH, 100.0)
|
total:@100
|
current:@60
|
clockwise:YES];
|
|
self.circleChart.backgroundColor = [UIColor whiteColor];
|
|
[self.circleChart setStrokeColor:[UIColor clearColor]];
|
[self.circleChart setStrokeColorGradientStart:[UIColor blueColor]];
|
[self.circleChart strokeChart];
|
|
[self.view addSubview:self.circleChart];
|
} else if ([self.title isEqualToString:@"Pie Chart"]) {
|
self.titleLabel.text = @"Pie Chart";
|
self.leftSwitch.hidden = NO;
|
self.rightSwitch.hidden = NO;
|
self.leftLabel.hidden = NO;
|
self.rightLabel.hidden = NO;
|
self.centerSwitch.hidden = NO;
|
self.centerSwitchLabel.hidden = NO;
|
|
|
NSArray *items = @[[PNPieChartDataItem dataItemWithValue:10 color:PNLightGreen],
|
[PNPieChartDataItem dataItemWithValue:20 color:PNFreshGreen description:@"WWDC"],
|
[PNPieChartDataItem dataItemWithValue:40 color:PNDeepGreen description:@"GOOG I/O"],
|
];
|
|
self.pieChart = [[PNPieChart alloc] initWithFrame:CGRectMake((CGFloat) (SCREEN_WIDTH / 2.0 - 100), 135, 200.0, 200.0) items:items];
|
self.pieChart.descriptionTextColor = [UIColor whiteColor];
|
self.pieChart.descriptionTextFont = [UIFont fontWithName:@"Avenir-Medium" size:11.0];
|
self.pieChart.descriptionTextShadowColor = [UIColor clearColor];
|
self.pieChart.showAbsoluteValues = NO;
|
self.pieChart.showOnlyValues = NO;
|
[self.pieChart strokeChart];
|
|
|
self.pieChart.legendStyle = PNLegendItemStyleStacked;
|
self.pieChart.legendFont = [UIFont boldSystemFontOfSize:12.0f];
|
|
UIView *legend = [self.pieChart getLegendWithMaxWidth:200];
|
[legend setFrame:CGRectMake(130, 350, legend.frame.size.width, legend.frame.size.height)];
|
[self.view addSubview:legend];
|
|
[self.view addSubview:self.pieChart];
|
self.changeValueButton.hidden = YES;
|
} else if ([self.title isEqualToString:@"Scatter Chart"]) {
|
self.animationsSwitch.hidden = YES;
|
|
self.titleLabel.text = @"Scatter Chart";
|
|
self.scatterChart = [[PNScatterChart alloc] initWithFrame:CGRectMake((CGFloat) (SCREEN_WIDTH / 6.0 - 30), 135, 280, 200)];
|
// self.scatterChart.yLabelFormat = @"xxx %1.1f";
|
[self.scatterChart setAxisXWithMinimumValue:20 andMaxValue:100 toTicks:6];
|
[self.scatterChart setAxisYWithMinimumValue:30 andMaxValue:50 toTicks:5];
|
[self.scatterChart setAxisXLabel:@[@"x1", @"x2", @"x3", @"x4", @"x5", @"x6"]];
|
[self.scatterChart setAxisYLabel:@[@"y1", @"y2", @"y3", @"y4", @"y5"]];
|
|
NSArray *data01Array = [self randomSetOfObjects];
|
PNScatterChartData *data01 = [PNScatterChartData new];
|
data01.strokeColor = PNGreen;
|
data01.fillColor = PNFreshGreen;
|
data01.size = 2;
|
data01.itemCount = [data01Array[0] count];
|
data01.inflexionPointStyle = PNScatterChartPointStyleCircle;
|
__block NSMutableArray *XAr1 = [NSMutableArray arrayWithArray:data01Array[0]];
|
__block NSMutableArray *YAr1 = [NSMutableArray arrayWithArray:data01Array[1]];
|
|
data01.getData = ^(NSUInteger index) {
|
CGFloat xValue;
|
xValue = [XAr1[index] floatValue];
|
CGFloat yValue = [YAr1[index] floatValue];
|
return [PNScatterChartDataItem dataItemWithX:xValue AndWithY:yValue];
|
};
|
|
[self.scatterChart setup];
|
self.scatterChart.chartData = @[data01];
|
/***
|
this is for drawing line to compare
|
CGPoint start = CGPointMake(20, 35);
|
CGPoint end = CGPointMake(80, 45);
|
[self.scatterChart drawLineFromPoint:start ToPoint:end WithLineWith:2 AndWithColor:PNBlack];
|
***/
|
self.scatterChart.delegate = self;
|
self.changeValueButton.hidden = YES;
|
[self.view addSubview:self.scatterChart];
|
} else if ([self.title isEqualToString:@"Radar Chart"]) {
|
self.titleLabel.text = @"Radar Chart";
|
|
self.leftSwitch.hidden = NO;
|
self.rightSwitch.hidden = NO;
|
self.leftLabel.hidden = NO;
|
self.rightLabel.hidden = NO;
|
self.leftLabel.text = @"Labels Style";
|
self.rightLabel.text = @"Graduation";
|
|
|
NSArray *items = @[[PNRadarChartDataItem dataItemWithValue:3 description:@"Art"],
|
[PNRadarChartDataItem dataItemWithValue:2 description:@"Math"],
|
[PNRadarChartDataItem dataItemWithValue:8 description:@"Sports"],
|
[PNRadarChartDataItem dataItemWithValue:5 description:@"Literature"],
|
[PNRadarChartDataItem dataItemWithValue:4 description:@"Other"],
|
];
|
self.radarChart = [[PNRadarChart alloc] initWithFrame:CGRectMake(0, 135.0, SCREEN_WIDTH, 300.0) items:items valueDivider:1];
|
|
self.radarChart.plotColor = [UIColor redColor];
|
|
[self.radarChart strokeChart];
|
|
[self.view addSubview:self.radarChart];
|
}
|
|
}
|
|
|
- (void)userClickedOnLineKeyPoint:(CGPoint)point lineIndex:(NSInteger)lineIndex pointIndex:(NSInteger)pointIndex {
|
NSLog(@"Click Key on line %f, %f line index is %d and point index is %d", point.x, point.y, (int) lineIndex, (int) pointIndex);
|
}
|
|
- (void)userClickedOnLinePoint:(CGPoint)point lineIndex:(NSInteger)lineIndex {
|
NSLog(@"Click on line %f, %f, line index is %d", point.x, point.y, (int) lineIndex);
|
}
|
|
|
- (IBAction)changeValue:(id)sender {
|
|
if ([self.title isEqualToString:@"Line Chart"]) {
|
|
// Line Chart #1
|
NSArray *data01Array = @[@(arc4random() % 300), @(arc4random() % 300), @(arc4random() % 300), @(arc4random() % 300), @(arc4random() % 300), @(arc4random() % 300), @(arc4random() % 300)];
|
PNLineChartData *data01 = [PNLineChartData new];
|
data01.color = PNFreshGreen;
|
data01.itemCount = data01Array.count;
|
data01.inflexionPointColor = PNRed;
|
data01.inflexionPointStyle = PNLineChartPointStyleTriangle;
|
data01.getData = ^(NSUInteger index) {
|
CGFloat yValue = [data01Array[index] floatValue];
|
return [PNLineChartDataItem dataItemWithY:yValue];
|
};
|
|
// Line Chart #2
|
NSArray *data02Array = @[@(arc4random() % 300), @(arc4random() % 300), @(arc4random() % 300), @(arc4random() % 300), @(arc4random() % 300), @(arc4random() % 300), @(arc4random() % 300)];
|
PNLineChartData *data02 = [PNLineChartData new];
|
data02.color = PNTwitterColor;
|
data02.itemCount = data02Array.count;
|
data02.inflexionPointStyle = PNLineChartPointStyleSquare;
|
data02.getData = ^(NSUInteger index) {
|
CGFloat yValue = [data02Array[index] floatValue];
|
return [PNLineChartDataItem dataItemWithY:yValue];
|
};
|
|
[self.lineChart setXLabels:@[@"DEC 1", @"DEC 2", @"DEC 3", @"DEC 4", @"DEC 5", @"DEC 6", @"DEC 7"]];
|
[self.lineChart updateChartData:@[data01, data02]];
|
|
} else if ([self.title isEqualToString:@"Bar Chart"]) {
|
[self.barChart setXLabels:@[@"Jan 1", @"Jan 2", @"Jan 3", @"Jan 4", @"Jan 5", @"Jan 6", @"Jan 7"]];
|
[self.barChart updateChartData:@[@(arc4random() % 30), @(arc4random() % 30), @(arc4random() % 30), @(arc4random() % 30), @(arc4random() % 30), @(arc4random() % 30), @(arc4random() % 30)]];
|
} else if ([self.title isEqualToString:@"Circle Chart"]) {
|
[self.circleChart updateChartByCurrent:@(arc4random() % 100)];
|
} else if ([self.title isEqualToString:@"Scatter Chart"]) {
|
// will be code soon.
|
}
|
|
}
|
|
- (void)userClickedOnBarAtIndex:(NSInteger)barIndex {
|
|
NSLog(@"Click on bar %@", @(barIndex));
|
|
PNBar *bar = self.barChart.bars[(NSUInteger) barIndex];
|
|
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
|
|
animation.fromValue = @1.0;
|
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
|
animation.toValue = @1.1;
|
animation.duration = 0.2;
|
animation.repeatCount = 0;
|
animation.autoreverses = YES;
|
animation.removedOnCompletion = YES;
|
animation.fillMode = kCAFillModeForwards;
|
|
[bar.layer addAnimation:animation forKey:@"Float"];
|
}
|
|
/* this function is used only for creating random points */
|
- (NSArray *)randomSetOfObjects {
|
NSMutableArray *array = [NSMutableArray array];
|
NSString *LabelFormat = @"%1.f";
|
NSMutableArray *XAr = [NSMutableArray array];
|
NSMutableArray *YAr = [NSMutableArray array];
|
for (int i = 0; i < 25; i++) {
|
[XAr addObject:[NSString stringWithFormat:LabelFormat, (((double) arc4random() / ARC4RANDOM_MAX) * (self.scatterChart.AxisX_maxValue - self.scatterChart.AxisX_minValue) + self.scatterChart.AxisX_minValue)]];
|
[YAr addObject:[NSString stringWithFormat:LabelFormat, (((double) arc4random() / ARC4RANDOM_MAX) * (self.scatterChart.AxisY_maxValue - self.scatterChart.AxisY_minValue) + self.scatterChart.AxisY_minValue)]];
|
}
|
[array addObject:XAr];
|
[array addObject:YAr];
|
return array;
|
}
|
|
- (IBAction)rightSwitchChanged:(id)sender
|
{
|
if ([self.title isEqualToString:@"Pie Chart"]) {
|
UISwitch *showLabels = (UISwitch *) sender;
|
self.pieChart.showOnlyValues = !showLabels.on;
|
[self.pieChart strokeChart];
|
}
|
if ([self.title isEqualToString:@"Radar Chart"]) {
|
UISwitch *showLabels = (UISwitch *) sender;
|
self.radarChart.isShowGraduation = !showLabels.on;
|
[self.radarChart strokeChart];
|
} else if ([self.title isEqualToString:@"Line Chart"])
|
{
|
UISwitch *showLabels = (UISwitch *) sender;
|
self.lineChart.showSmoothLines = showLabels.on;
|
NSLog(@"self.lineChart.showSmoothLines : %d", self.lineChart.showSmoothLines);
|
[self.lineChart strokeChart];
|
}
|
}
|
|
- (IBAction)centerSwitchChanged:(id)sender {
|
if (self.pieChart) {
|
[self.pieChart setEnableMultipleSelection:self.centerSwitch.on];
|
[self.pieChart strokeChart];
|
}
|
|
}
|
|
- (IBAction)leftSwitchChanged:(id)sender {
|
if ([self.title isEqualToString:@"Pie Chart"]) {
|
UISwitch *showRelative = (UISwitch *) sender;
|
self.pieChart.showAbsoluteValues = !showRelative.on;
|
[self.pieChart strokeChart];
|
} else if ([self.title isEqualToString:@"Radar Chart"]) {
|
UISwitch *showRelative = (UISwitch *) sender;
|
if (showRelative.on) {
|
self.radarChart.labelStyle = PNRadarChartLabelStyleHorizontal;
|
} else {
|
self.radarChart.labelStyle = PNRadarChartLabelStyleCircle;
|
}
|
[self.radarChart strokeChart];
|
|
} else if ([self.title isEqualToString:@"Line Chart"]) {
|
UISwitch *senderSwitch = (UISwitch *) sender;
|
if (senderSwitch.isOn) {
|
UIColor *lineChartLabelColor = [UIColor cyanColor];
|
UIColor *darkBackgroundColor = [UIColor colorWithRed:0.47 green:0.47 blue:0.47 alpha:1.0];
|
|
UIColor *gridLinesForDarkBackgroundColor = [UIColor colorWithRed:242 / 255.0 green:242 / 255.0 blue:242 / 255.0 alpha:1.0];
|
self.lineChart.backgroundColor = darkBackgroundColor;
|
self.lineChart.yGridLinesColor = gridLinesForDarkBackgroundColor;
|
self.lineChart.showYGridLines = YES;
|
self.lineChart.yLabelColor = lineChartLabelColor;
|
self.lineChart.xLabelColor = lineChartLabelColor;
|
[self.lineChart.chartData enumerateObjectsUsingBlock:^(PNLineChartData *obj, NSUInteger idx, BOOL *stop) {
|
obj.pointLabelColor = lineChartLabelColor;
|
}];
|
} else {
|
self.lineChart.backgroundColor = [UIColor whiteColor];
|
self.lineChart.yGridLinesColor = [UIColor grayColor];
|
self.lineChart.yLabelColor = [UIColor blackColor];
|
self.lineChart.xLabelColor = [UIColor blackColor];
|
[self.lineChart.chartData enumerateObjectsUsingBlock:^(PNLineChartData *obj, NSUInteger idx, BOOL *stop) {
|
obj.pointLabelColor = [UIColor blackColor];
|
}];
|
}
|
[self.lineChart setXLabels:@[@"DEC 1", @"DEC 2", @"DEC 3", @"DEC 4", @"DEC 5", @"DEC 6", @"DEC 7"]];
|
[self.lineChart setYLabels:@[
|
@"0 min",
|
@"50 min",
|
@"100 min",
|
@"150 min",
|
@"200 min",
|
@"250 min",
|
@"300 min",
|
]
|
];
|
[self.lineChart strokeChart];
|
}
|
}
|
|
- (IBAction)animationsSwitchChanged:(UISwitch *)sender {
|
if ([self.title isEqualToString:@"Circle Chart"]) {
|
self.circleChart.displayAnimated = sender.on;
|
[self.circleChart strokeChart];
|
} else if ([self.title isEqualToString:@"Line Chart"]) {
|
self.lineChart.displayAnimated = sender.on;
|
[self.lineChart strokeChart];
|
} else if ([self.title isEqualToString:@"Bar Chart"]) {
|
self.barChart.displayAnimated = sender.on;
|
[self.barChart strokeChart];
|
} else if ([self.title isEqualToString:@"Pie Chart"]) {
|
self.pieChart.displayAnimated = sender.on;
|
[self.pieChart strokeChart];
|
} else if ([self.title isEqualToString:@"Radar Chart"]) {
|
self.radarChart.displayAnimated = sender.on;
|
[self.radarChart strokeChart];
|
}
|
}
|
|
@end
|