如何使用核心图在x轴上绘制一年中的几个月,并且在y轴上我需要200的倍数 我以前从excel sheet获得的数据更多。任何人都可以帮助我解决这个问题。 提前谢谢....
答案 0 :(得分:0)
以下是从最近的项目中获取的一些示例代码。我的x轴数据是NSDates数组。我正常设置了我的axisSet,然后在下面添加了以下代码:
axisSet.xAxis.labelingPolicy = CPTAxisLabelingPolicyNone;
NSMutableArray *countingXPoints=[[NSMutableArray alloc] init];
NSMutableArray *datesAsStrings=[[NSMutableArray alloc] init];
NSDateFormatter *df=[[NSDateFormatter alloc] init];
[df setDateFormat:@"MM-yy"];
for(int i=0; i<[self.xAxisData count]; i++)
{
[countingXPoints addObject:[NSNumber numberWithInt:i]];
[datesAsStrings addObject:[df stringFromDate:[self.xAxisData objectAtIndex:i]]];
}
NSArray *xCustomTickLocations = [NSArray arrayWithArray:(NSArray *)countingXPoints];
NSArray *xAxisLabels = [NSArray arrayWithArray:(NSArray *) datesAsStrings];
NSUInteger xLabelLocation = 0;
NSMutableArray *xCustomLabels = [[NSMutableArray alloc] initWithCapacity:[xAxisLabels count]];
for (NSNumber *xTickLocation in xCustomTickLocations)
{
CPTAxisLabel *newXLabel = [[CPTAxisLabel alloc] initWithText: [xAxisLabels objectAtIndex:xLabelLocation++] textStyle:axisSet.xAxis.labelTextStyle];
newXLabel.tickLocation = [xTickLocation decimalValue];
newXLabel.offset = 0.0f;
newXLabel.rotation = M_PI/4.0;
[xCustomLabels addObject:newXLabel];
}
axisSet.xAxis.axisLabels=[NSSet setWithArray:xCustomLabels];
对于问题的y轴部分,您可以调整刻度间隔(CPTXYAxis的属性)。要获得正确的轴高度/长度,请查看绘图空间的xRange,yRange,globalXRange和globalYRance属性。
答案 1 :(得分:0)
我做了你想要的东西,比如这段代码。对不起,我不清楚这里的代码,只是粘贴我在这里使用的整个方法。
我希望这可能有助于你想要的东西。在这里,我以新的方式实现了图形,您可以像tableview一样刷新它。只需更改数组的值然后调用[graph reloadData];
- (void)constructScatterPlotForFeedback
{
// Create graph from theme
[graph release];
graph = [[CPXYGraph alloc] initWithFrame:CGRectZero];
graph.delegate = self;
CPTheme *theme = [CPTheme themeNamed:kCPPlainWhiteTheme];
[graph applyTheme:theme];
feedbackChart.hostedGraph = graph;
[feedbackChart setBackgroundColor:[UIColor clearColor]];
graph.paddingLeft = 0.0;
graph.paddingTop = 0.0;
graph.paddingRight = 0.0;
graph.paddingBottom = 0.0;
graph.plotAreaFrame.paddingLeft = 5.0;
graph.plotAreaFrame.paddingTop = 10.0;
graph.plotAreaFrame.paddingRight = 10.0;
graph.plotAreaFrame.paddingBottom = 10.0;
NSTimeInterval oneHour = 60 * 60;
// Setup plot space
CPXYPlotSpace *plotSpace = (CPXYPlotSpace *)graph.defaultPlotSpace;
plotSpace.allowsUserInteraction = YES;
plotSpace.delegate = self;
float xRange;
xRange = [chartData count] + 1.0;
if (xRange>5) {
xRange = 5.0;
}
plotSpace.xRange = [CPPlotRange plotRangeWithLocation:CPDecimalFromFloat(0.0) length:CPDecimalFromFloat(fiveHour*3)];
plotSpace.yRange = [CPPlotRange plotRangeWithLocation:CPDecimalFromFloat(-20.0) length:CPDecimalFromFloat(40.0)];
CPLineStyle *gridline = [CPLineStyle lineStyle];
gridline.lineColor = [CPColor grayColor];
gridline.lineWidth = 1.0f;
// Axes
CPXYAxisSet *axisSet = (CPXYAxisSet *)graph.axisSet;
CPXYAxis *x = axisSet.xAxis;
// x.orthogonalCoordinateDecimal = CPDecimalFromString(@"0");
x.majorIntervalLength = CPDecimalFromFloat(fiveHour);
//x.majorIntervalLength = CPDecimalFromFloat(10.0);
//x.majorIntervalLength = CPDecimalFromString(@"10");
x.minorTicksPerInterval = 0;
x.labelOffset=0;
// x.labelingPolicy = CPAxisLabelingPolicyNone;
NSDate *refDate = [NSDate date];
NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
// dateFormatter.dateStyle = kCFTimeZoneNameStyleShortGeneric;
dateFormatter.dateFormat = @"HH:mm:ss";
// dateFormatter.dateStyle = kCFDateFormatterShortStyle;
CPTimeFormatter *timeFormatter = [[[CPTimeFormatter alloc] init WithDateFormatter:dateFormatter] autorelease];
timeFormatter.referenceDate = refDate;
x.labelFormatter = timeFormatter;
//NSLog(@"refence date : %@", timeFormatter);
CPXYAxis *y = axisSet.yAxis;
y.minorTicksPerInterval = 0;
y.orthogonalCoordinateDecimal = CPDecimalFromString(@"0.0");
y.majorIntervalLength = CPDecimalFromString(@"5");
y.majorGridLineStyle = nil;
//y.visibleRect
y.visibleRange = [CPPlotRange plotRangeWithLocation:CPDecimalFromFloat(-20.0f) length:CPDecimalFromFloat(40.0f)];
CPConstraints yConstraints = {CPConstraintNone, CPConstraintFixed};
y.isFloatingAxis=YES;
y.constraints=yConstraints;
// Create a green plot area
CPScatterPlot *dataSourceLinePlot = [[[CPScatterPlot alloc] init] autorelease];
dataSourceLinePlot.identifier = @"FeedBack Plot";
dataSourceLinePlot.dataLineStyle.lineWidth = 3.f;
dataSourceLinePlot.dataLineStyle.lineColor = [CPColor blackColor];
dataSourceLinePlot.dataLineStyle.dashPattern = [NSArray arrayWithObjects:[NSNumber numberWithFloat:1.0f], [NSNumber numberWithFloat:1.0f], nil];
dataSourceLinePlot.dataSource = self;
// Animate in the new plot, as an example
dataSourceLinePlot.opacity = 0.0f;
dataSourceLinePlot.cachePrecision = CPPlotCachePrecisionDecimal;
CABasicAnimation *fadeInAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"];
fadeInAnimation.duration = 1.0f;
fadeInAnimation.removedOnCompletion = NO;
fadeInAnimation.fillMode = kCAFillModeForwards;
fadeInAnimation.toValue = [NSNumber numberWithFloat:1.0];
[dataSourceLinePlot addAnimation:fadeInAnimation forKey:@"animateOpacity"];
CPColor *areaColor1 = [CPColor colorWithComponentRed:0.3 green:0.3 blue:1.0 alpha:0.8];
CPGradient *areaGradient1 = [CPGradient gradientWithBeginningColor:areaColor1 endingColor:[CPColor clearColor]];
areaGradient1.angle = -90.0f;
NSUInteger i;
[graph addPlot:dataSourceLinePlot];
NSMutableArray *contentArray1 = [NSMutableArray arrayWithCapacity:100];
NSMutableArray *customTickLocations = [[NSMutableArray alloc] init];
NSMutableArray *xAxisLabels = [[NSMutableArray alloc] init];
for ( i = 0; i < [chartData count]; i++ ) {
//for ( i = 0; i < 10; i++ ) {
[customTickLocations addObject:[NSDecimalNumber numberWithInt:i]];
[xAxisLabels addObject:[NSString stringWithFormat:@"%0.1f", 5.0 * i]];
Pulse *objPulse1 = (Pulse *)[chartData objectAtIndex:i];
//id x = [NSNumber numberWithFloat:i*fiveHour];
id x = [NSNumber numberWithFloat:i];
id y = [NSNumber numberWithFloat:[objPulse1.feedBack floatValue]];
NSLog(@"point of gragh for Performance x:%@, y : %@ ", x, y);
[contentArray1 addObject:[NSMutableDictionary dictionaryWithObjectsAndKeys:x, @"x", y, @"y", nil]];
}
NSLog(@"Axis lable count : %d", [xAxisLabels count]);
NSMutableArray *customLabels = [NSMutableArray arrayWithCapacity:[chartData count]];
NSUInteger labelLocation = 0;
for (NSNumber *tickLocation in customTickLocations) {
NSLog(@">>>>>>>>>>>>>>>>> tick location");
CPAxisLabel *newLabel = [[CPAxisLabel alloc] initWithText: [xAxisLabels objectAtIndex:labelLocation++] textStyle:x.labelTextStyle];
newLabel.tickLocation = [tickLocation decimalValue];
newLabel.offset = x.labelOffset + x.majorTickLength - 5.0f;
// newLabel.rotation = M_PI/(2);
newLabel.rotation = 0;
[customLabels addObject:newLabel];
[newLabel release];
}
x.axisLabels = [NSSet setWithArray:customLabels];
// [arrScatter removeAllObjects];
arrScatter = contentArray1;
[arrScatter retain];
// NSLog(@">>>>>>>>>>>> :%d", [arrScatter count]);
}
-(NSUInteger)numberOfRecordsForPlot:(CPPlot *)plot
{
if ( [(NSString *)plot.identifier isEqualToString:@"FeedBack Plot"] ) {
return [chartData count];
// return 10;
}
return 0;
}
-(NSNumber *)numberForPlot:(CPPlot *)plot field:(NSUInteger)fieldEnum recordIndex:( NSUInteger)index
{
switch ( fieldEnum ) {
case CPScatterPlotFieldX:
return (NSDecimalNumber *)[NSDecimalNumber numberWithUnsignedInteger:index*fiveHour];
case CPScatterPlotFieldY:
{
Pulse *objPulse1 = (Pulse *)[chartData objectAtIndex:index];
return [NSNumber numberWithFloat:[objPulse1.feedBack floatValue]];
}
}
return nil;
}
-(CGPoint)plotSpace:(CPPlotSpace *)space willDisplaceBy:(CGPoint)displacement {
// NSLog(@">>>>>>>>>>>>>>>>>> : %f", displacement.x);
return CGPointMake(displacement.x, 0);
}
/*
-(NSNumber *)numberForPlot:(CPPlot *)plot field:(NSUInteger)fieldEnum recordIndex: (NSUInteger)index
{
NSDecimalNumber *num = nil;
if ( [(NSString *)plot.identifier isEqualToString:@"FeedBack Plot"] ) {
if ( [arrScatter count] != 0) {
num = [[arrScatter objectAtIndex:index] valueForKey:(fieldEnum == CPScatterPlotFieldX ? @"x" : @"y")];
}
}
return num;
}
*/
-(CPLayer *)dataLabelForPlot:(CPPlot *)plot recordIndex:(NSUInteger)index {
Pulse *objPulse1 = (Pulse *)[chartData objectAtIndex:index];
float value = [objPulse1.feedBack floatValue];
//CPTextLayer *textLayer = [[CPTextLayer alloc] initWithText:[NSString stringWithFormat:@"%d", value]];
CPTextStyle *textStyle = [CPTextStyle textStyle];
textStyle.color = [CPColor blackColor];
CPTextLayer *textLayer = [[CPTextLayer alloc] initWithText:[NSString stringWithFormat:@"%0.1f", value] style:textStyle];
return textLayer;
}
答案 2 :(得分:0)
使用CPTCalendarFormatter代替CPTTimeFormatter,如其他答案中所述。当您必须设置以秒为单位的时间间隔偏移时(例如,小时= 60 * 60,天= 24 * 60 * 60),CPTTimeFormatter是好的,但是月份具有可变的天数/秒(30 * 24 * 60 * 60或31 * 24 * 60 * 60,28,闰年ecc。)。 CPTCalendarFormatter允许您决定标签上日期计算的日历单位。通过这种方式,修复了参考日期和参考日历单位,在数据源方法中,您必须从参考日期开始返回这些单位的数量。
这是完整的代码,享受。
在viewDidLoad或其他地方,您初始化图表:
[...]
// Graph host view
CPTGraphHostingView* hostView = [[CPTGraphHostingView alloc] initWithFrame:self.view.frame];
[self.view addSubview: hostView];
// Your graph
CPTGraph* graph = [[CPTXYGraph alloc] initWithFrame:hostView.bounds];
hostView.hostedGraph = graph;
CPTXYAxisSet *axisSet = (CPTXYAxisSet *)[graph axisSet];
// xAxis configuration
CPTXYAxis *xAxis = [axisSet xAxis];
[xAxis setLabelingPolicy:CPTAxisLabelingPolicyFixedInterval];
// Prepare dateFormat for current Locale, we want "JAN 2014" "FEB 2014" and so on
NSString *dateComponents = @"MMMYY";
NSString *localDateFormat = [NSDateFormatter dateFormatFromTemplate:dateComponents options:0 locale:[NSLocale currentLocale]];
NSDateFormatter *labelDateFormatter=[[NSDateFormatter alloc] init];
labelDateFormatter.dateFormat=localDateFormat;
// Set xAxis date Formatter
CPTCalendarFormatter *xDateYearFormatter = [[CPTCalendarFormatter alloc] initWithDateFormatter:labelDateFormatter];
//Keep in mind this reference date, it will be used to calculate NSNumber in dataSource method
xDateYearFormatter.referenceDate = [NSDate dateWithTimeIntervalSince1970:0];
xDateYearFormatter.referenceCalendarUnit=NSMonthCalendarUnit;
[xAxis setLabelFormatter:xDateYearFormatter];
// yAxis configuration
CPTXYAxis *yAxis = [axisSet yAxis];
[yAxis setMajorIntervalLength:CPTDecimalFromFloat(_YOURYINTERVAL_)];
[yAxis setLabelingPolicy:CPTAxisLabelingPolicyFixedInterval];
[yAxis setLabelFormatter:_YOURYFORMATTER_];
[yAxis setAxisConstraints:[CPTConstraints constraintWithLowerOffset:0.0]]
// Get the (default) plotspace from the graph so we can set its x/y ranges
CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *) graph.defaultPlotSpace;
NSDate *startDate=_YOURSTARTINGDATE_
//Number of months since the reference date
NSInteger xStart=[[[NSCalendar currentCalendar] components: NSCalendarUnitMonth
fromDate: xDateYearFormatter.referenceDate
toDate: _YOURSTARTINGDATE_
options: 0] month];
[plotSpace setXRange: [CPTPlotRange plotRangeWithLocation:CPTDecimalFromInteger(xStart) length:CPTDecimalFromInteger(_YOURDATESARRAY_.count-1)]];
[plotSpace setYRange: [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.0) length:CPTDecimalFromFloat(_YOURMAXYVALUE_)]];
[...]
在轴上返回值的数据源方法:
-(NSNumber *)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index
{
switch (fieldEnum) {
case CPTScatterPlotFieldX: {
NSInteger monthsOffset=[[[NSCalendar currentCalendar] components: NSCalendarUnitMonth fromDate: [NSDate dateWithTimeIntervalSince1970:0] toDate: [_YOURDATESARRAY_ objectAtIndex:index] options: 0] month];
NSNumber *val = [NSNumber numberWithInteger:monthsOffset];
return val;
break;
}
case CPTScatterPlotFieldY: {
NSNumber *val=_YOURVALUEFORYAXIS_;
return val;
break;
}
default:
break;
}
return nil;
}
答案 3 :(得分:-1)
回答有点迟,但我碰巧刚刚做了这个:
首先必须定义标签:
NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@“MMM”]; CPTTimeFormatter * timeFormatter = [[CPTTimeFormatter alloc] initWithDateFormatter:dateFormatter];
结果如下:Jan,Feb,Mar等。
然后将轴设置为天数:在Core Plot示例中,您可以在日期图中看到这样做。粗略估计每个月30天,因此使用这些定义:
定义ONE_DAY(24 * 60 * 60) 定义ONE_MONTH(30 * ONE_DAY)
然后设置X轴:
x.majorIntervalLength = CPTDecimalFromFloat(ONE_MONTH);
Y轴是: y.majorIntervalLength = CPTDecimalFromFloat(200);