我需要帮助使用CorePlot绘制日期与数字图表。我已经查看了DatePlot。但我的要求有点不同,如下所示。
我有一个对象数组,其中每个对象都有一个NSDate和一个Double数字。 例如: 5个对象的数组:( NSDate格式为yyyy-mm-dd)
此数据来自服务,每次都会有所不同。
请告知。
答案 0 :(得分:4)
我使用CPTScatterPlot
来显示与您类似的时间序列数据图表。
您需要创建一个数据源类,在绘制图形时将由核心图查询。我的数据源对象包含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。如果您需要更多详细信息,请询问。祝你好运!