2012-02-29 49 views
2

我是coreplot的新手,我想沿着使用coreplot绘制的条形图的x轴显示NSdate(year或moth或day)。我已经通过了一些示例绘制的NSDate沿X-axis.but时无法绘制..无法沿CorePlot绘制NSdate沿着X轴

请任何一个可以给我提供的代码,沿x轴绘制的NSDate ... 感谢

我试图从计算器下面的代码但我无法在x轴上显示标签

// If you make sure your dates are calculated at noon, you shouldn't have to 
// worry about daylight savings. If you use midnight, you will have to adjust 
// for daylight savings time. 
NSDate *refDate = [NSDate dateWithTimeIntervalSinceReferenceDate:31556926 * 10]; 
NSTimeInterval oneDay = 24 * 60 * 60; 

// Invert graph view to compensate for iOS coordinates 
//CGAffineTransform verticalFlip = CGAffineTransformMakeScale(1,-1); 
// self.view.transform = verticalFlip; 

// allocate the graph within the current view bounds 
graph = [[CPTXYGraph alloc] initWithFrame: self.view.bounds]; 

// assign theme to graph 
CPTTheme *theme = [CPTTheme themeNamed:kCPTDarkGradientTheme]; 
[graph applyTheme:theme]; 

// Setting the graph as our hosting layer 
CPTGraphHostingView *hostingView = [[CPTGraphHostingView alloc] initWithFrame:self.view.bounds]; 

[self.view addSubview:hostingView]; 

hostingView.hostedGraph = graph; 

graph.paddingLeft = 20.0; 
graph.paddingTop = 20.0; 
graph.paddingRight = 20.0; 
graph.paddingBottom = 150.0; 

// setup a plot space for the plot to live in 
CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)graph.defaultPlotSpace; 
NSTimeInterval xLow = 0.0f; 
// sets the range of x values 
plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(xLow) 
               length:CPTDecimalFromFloat(oneDay*5.0f)]; 
// sets the range of y values 
plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.0) 
               length:CPTDecimalFromFloat(5)]; 

// plotting style is set to line plots 
CPTMutableLineStyle *lineStyle = [CPTMutableLineStyle lineStyle]; 
lineStyle.lineColor = [CPTColor blackColor]; 
lineStyle.lineWidth = 2.0f; 

// X-axis parameters setting 
CPTXYAxisSet *axisSet = (id)graph.axisSet; 
axisSet.xAxis.majorIntervalLength = CPTDecimalFromFloat(oneDay); 
axisSet.xAxis.minorTicksPerInterval = 0; 
axisSet.xAxis.orthogonalCoordinateDecimal = CPTDecimalFromString(@"1"); //added for date, adjust x line 
axisSet.xAxis.majorTickLineStyle = lineStyle; 
axisSet.xAxis.minorTickLineStyle = lineStyle; 
axisSet.xAxis.axisLineStyle = lineStyle; 
axisSet.xAxis.minorTickLength = 5.0f; 
axisSet.xAxis.majorTickLength = 7.0f; 
axisSet.xAxis.labelOffset = 3.0f; 

// added for date 
NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; 
dateFormatter.dateStyle = kCFDateFormatterShortStyle; 
CPTTimeFormatter *timeFormatter = [[[CPTTimeFormatter alloc] initWithDateFormatter:dateFormatter] autorelease]; 
timeFormatter.referenceDate = refDate; 
axisSet.xAxis.labelFormatter = timeFormatter; 

// Y-axis parameters setting  
axisSet.yAxis.majorIntervalLength = CPTDecimalFromString(@"0.5"); 
axisSet.yAxis.minorTicksPerInterval = 2; 
axisSet.yAxis.orthogonalCoordinateDecimal = CPTDecimalFromFloat(oneDay); // added for date, adjusts y line 
axisSet.yAxis.majorTickLineStyle = lineStyle; 
axisSet.yAxis.minorTickLineStyle = lineStyle; 
axisSet.yAxis.axisLineStyle = lineStyle; 
axisSet.yAxis.minorTickLength = 5.0f; 
axisSet.yAxis.majorTickLength = 7.0f; 
axisSet.yAxis.labelOffset = 3.0f; 


// This actually performs the plotting 
CPTScatterPlot *xSquaredPlot = [[[CPTScatterPlot alloc] init] autorelease]; 

CPTMutableLineStyle *dataLineStyle = [CPTMutableLineStyle lineStyle]; 
//xSquaredPlot.identifier = @"X Squared Plot"; 
xSquaredPlot.identifier = @"Date Plot"; 

dataLineStyle.lineWidth = 1.0f; 
dataLineStyle.lineColor = [CPTColor redColor]; 
xSquaredPlot.dataLineStyle = dataLineStyle; 
xSquaredPlot.dataSource = self; 

CPTPlotSymbol *greenCirclePlotSymbol = [CPTPlotSymbol ellipsePlotSymbol]; 
greenCirclePlotSymbol.fill = [CPTFill fillWithColor:[CPTColor greenColor]]; 
greenCirclePlotSymbol.size = CGSizeMake(2.0, 2.0); 
xSquaredPlot.plotSymbol = greenCirclePlotSymbol; 

// add plot to graph 
[graph addPlot:xSquaredPlot]; 

// Add some data 
NSMutableArray *newData = [NSMutableArray array]; 
NSUInteger i; 
for (i = 0; i < 5; i++) { 
    NSTimeInterval x = oneDay*i; 
    id y = [NSDecimalNumber numberWithFloat:1.2*rand()/(float)RAND_MAX + 1.2]; 
    [newData addObject: 
    [NSDictionary dictionaryWithObjectsAndKeys: 
     [NSDecimalNumber numberWithFloat:x], [NSNumber numberWithInt:CPTScatterPlotFieldX], 
     y, [NSNumber numberWithInt:CPTScatterPlotFieldY], 
     nil]]; 
    NSLog(@"%@",newData); 
} 
plotData = [newData retain]; 

} 

#pragma mark - Plot Data Source Methods 
-(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot 
{ 
return plotData.count; 
} 

-(NSNumber *)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:  (NSUInteger)index 
{ 
NSDecimalNumber *num = [[plotData objectAtIndex:index] objectForKey:[NSNumber numberWithInt:fieldEnum]]; 
return num; 
} 
+0

如果您已经查看了Core Plot中包含的DatePlot和Plot Gallery示例,并且仍然遇到问题,请编辑您的问题以解释您迄今尝试的内容(使用代码)。 – 2012-03-01 02:14:20

回答

7

如果您正在寻找这样做......(我对图像的大小道歉,我不熟悉如何尺寸的图像为SO)

Key Indicators

您需要定义自定义X轴的标签。

考虑下面的代码片段(从产生上面的图像的代码获取):

/* --Define some custom labels for the data elements-- */ 
// Note that x is defined as: CPTXYAxisSet *axisSet = (CPTXYAxisSet*)self.graph.axisSet; 
//          CPTXYAxis *x = axisSet.xAxis; 
x.labelingPolicy = CPTAxisLabelingPolicyNone; // This allows us to create custom axis labels for x axis 
NSMutableArray *ticks = [NSMutableArray arrayWithCapacity:1]; 
for(unsigned int counter = 0; counter < [_axisLabelStrings count];counter++) { 
    // Here the instance variable _axisLabelStrings is a list of custom labels 
    [ticks addObject:[NSNumber numberWithInt:counter]]; 
} 
NSUInteger labelLocation = 0; 
NSMutableArray* customLabels = [NSMutableArray arrayWithCapacity:[_axisLabelStrings count]]; 
@try { 
    for (NSNumber *tickLocation in ticks) { 
     CPTAxisLabel *newLabel = [[CPTAxisLabel alloc] initWithText: [_axisLabelStrings objectAtIndex:labelLocation++] textStyle:x.labelTextStyle]; 
     newLabel.tickLocation = [tickLocation decimalValue]; 
     newLabel.offset = 3.0f;//x.labelOffset + x.majorTickLength could be useful here. 
     newLabel.rotation = M_PI/3.5f; 
     [customLabels addObject:newLabel]; 
     [newLabel release]; 
    } 
} 
@catch (NSException * e) { 
    NSLog(@"An exception occurred while creating date labels for x-axis"); 
} 
@finally { 
    x.axisLabels = [NSSet setWithArray:customLabels]; 
} 
x.majorTickLocations = [NSSet setWithArray:ticks]; 

注意,_axisLabelStrings将需要进行处理和分类,你怎么想的那样。您将需要采取NSDates,对它们进行排序,并为您的标签生成NSString。

但是,简而言之,就是您如何创建自定义标签。

+0

您能否为此提供示例代码。我也对这个问题感到震惊。谢谢 – Annu 2014-10-17 17:04:55