我用 aCPTScatterPlot
来显示像你这样的时间序列数据图。
您需要创建一个数据源类,它在绘制图形时将被核心图查询。我的数据源对象包含一个NSArray
具有两个属性的对象:observationDate
和observationValue
. 该类必须实现CPTPlotDataSource
协议。这些是我实现的协议方法:
#pragma mark- CPPlotDataSource protocol methods
- (NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot
{
// return the number of objects in the time series
return [self.timeSeries count];
}
-(NSNumber *)numberForPlot:(CPTPlot *)plot
field:(NSUInteger)fieldEnum
recordIndex:(NSUInteger)index
{
NSNumber * result = [[NSNumber alloc] init];
// This method returns x and y values. Check which is being requested here.
if (fieldEnum == CPTScatterPlotFieldX)
{
// x axis - return observation date converted to UNIX TS as NSNumber
NSDate * observationDate = [[self.timeSeries objectAtIndex:index] observationDate];
NSTimeInterval secondsSince1970 = [observationDate timeIntervalSince1970];
result = [NSNumber numberWithDouble:secondsSince1970];
}
else
{
// y axis - return the observation value
result = [[self.timeSeries objectAtIndex:index] observationValue];
}
return result;
}
请注意,我将日期转换为双精度 - 不能直接绘制日期。我在类上实现了其他方法来返回值,例如时间序列的开始和结束日期以及最小/最大值 - 这些在配置图形的 PlotSpace 时很有用。
初始化数据源后,将其分配给 CPTScatterPlot 的 dataSource 属性:
...
CPTXYGraph * myGraph = [[CPTXYGraph alloc] initWithFrame:self.bounds];
// define your plot space here (xRange, yRange etc.)
...
CPTScatterPlot * myPlot = [[CPTScatterPlot alloc] initWithFrame:graph.defaultPlotSpace.accessibilityFrame];
// graphDataSource is your data source class
myPlot.dataSource = graphDataSource;
[myGraph addPlot:myPlot];
...
查看核心绘图下载中的 CPTTestApp,了解配置图形和绘图空间的详细信息。如果您需要更多详细信息,请询问。祝你好运!