2010-06-08 7 views
15

У меня есть массив словаря, который содержит NSDate и NSNumber значения. Я хотел построить дату на оси X. Для построения графика мне нужно предоставить xRanges для построения с некоторыми десятичными значениями. Я не понимаю, как я могу поставить значения NSDate в xRange (низкий и длинный).Использование основного участка для iPhone, дата рисования по оси x

И что должно быть там в этом методе:

-(NSNumber *)numberForPlot:(CPPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index 

Я имею в виду, как мое значение даты будет возвращено как NSNumber? Я думаю, что я должен использовать некоторый интервал там, но каково должно быть точное преобразование? Может ли кто-нибудь объяснить мне, что является точным требованием для построения даты на xAxis?

Я планирую свой участок в половине обзора.

+0

Привет, xmax Я делаю то же самое в своем проекте. Вы нашли какое-либо решение для этого? – sandy

+0

Я застрял в проблеме, с которой вы сталкиваетесь. так вы будете вести меня, что вы делаете в этой ситуации. –

+0

ПРИМЕЧАНИЕ. Одна вещь, в современной iOS, единственный способ, которым Apple рекомендует использовать формат даты: https://stackoverflow.com/a/42370648/294884 – Fattie

ответ

8

Посмотрите программу DatePlot в папке примеров. Он показывает, как форматировать метки осей в качестве дат.

+0

Infact Я следую этому примеру. но используя этот трюк для построения графика, но график не отображается. поскольку он не находится под диапазоном или что-то не так с предоставлением значений. Фактически, мои данные содержат дату с последних 3 до 6 месяцев. Я не понимаю, что именно я должен предоставить ссылочную дату при преобразовании NSdate в эквивалентный NSDecimalNumber. И я смущен над plotSpace.xRange. что я должен поставить.? Я имею в виду, как я могу рассчитать диапазон дат для поставки xRange из моего источника данных.? – xmax

+0

И еще одна вещь: я не могу правильно отображать дату на xAxis, с примером фондового участка в coreplot. , если мне нужно нарисовать xAxis на основном графике, например, пример StockPlot, тогда как это будет ..? – xmax

+2

Референтная дата может быть любой, что вы хотите. Он определяет нулевую точку для оси. Исходным местом для диапазона оси является разница между вашей первой датой на оси и контрольной датой в секундах. Длина диапазона - это длина диапазона в секундах (86400 секунд в день). –

36

Здесь вы идете, DatePlot работает на iOS. Не забудьте проверить правильность.

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view from its nib. 

    // 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

эй, это очень помогло мне. Я просто не могу понять, как на самом деле решить, какое значение написано на оси х, для которой NSTimeInterval? – JonasG

+1

Привет, @zambono, какой тип символа «plotData»? Я хочу знать его определение. – Sabbath

+1

С CorePlot 1.1 вам больше не нужно инвертировать ось y. Над кодом работает, если вы берете строки «verticalFlip». –

Смежные вопросы