Как нанести NSDate вдоль оси X, используя график Core - PullRequest
5 голосов
/ 13 апреля 2011

Я попытался просмотреть все примеры на основном графике, например, на dateplot, но все же я застрял в реализации графика с часами вдоль оси x.Пожалуйста, помогите мне узнать, где я иду не так.

Проблемы, с которыми я сталкиваюсь:

  • Не удалось получить ось с равномерно распределенными часами (почасовая шкала, 0900, 1000 ,....)
  • Когда я сохраняю его в массив plotData и когда график рисуется, все значения x равны 0. Я имею в виду, что все значения отображаются только на оси y.Значения x не сохраняются.

Код выглядит следующим образом:

NSDateFormatter *dateFormatter1 = [[[NSDateFormatter alloc] init] autorelease];
[dateFormatter1 setDateFormat:@"HH:mm a"];
 NSTimeInterval oneDay = 24 * 60 * 60;
 NSTimeInterval xLow = 0.0f;

//This part is used to set up the plot space.
CPXYPlotSpace *plotSpace = (CPXYPlotSpace *)graph.defaultPlotSpace;
plotSpace.allowsUserInteraction=YES;
plotSpace.xRange = [CPPlotRange plotRangeWithLocation:CPDecimalFromFloat(xLow)
                                                 length:CPDecimalFromFloat(oneDay)];


    CPXYAxisSet *axisSet = (CPXYAxisSet *)graph.axisSet;
CPXYAxis *x=axisSet.xAxis;
x.majorIntervalLength = CPDecimalFromFloat(1*60*60);
x.minorTicksPerInterval = 0;
x.axisLineStyle = lineStyle;
x.majorTickLength = 7.0f;
//x.visibleRange=xAxisRange;

CPTimeFormatter *timeFormatter = [[[CPTimeFormatter alloc]
                                   initWithDateFormatter:dateFormatter1] autorelease];
 Chirp *retValue=[someTemp objectAtIndex:0];
NSDate *tempDate=retValue.startingAt;
timeFormatter.referenceDate = tempDate;
x.labelFormatter = timeFormatter;
x.orthogonalCoordinateDecimal=CPDecimalFromString(@"0");


  NSMutableArray *newData = [NSMutableArray array];
NSUInteger i;
for ( i = 0; i < [someTemp count]; i++ ) 
{
    Chirp *retValue=[[Chirp alloc]init];
    retValue=[someTemp objectAtIndex:i];
    NSDate *tempDate=retValue.startingAt;
    NSString *dateFromString=[dateFormatter1 stringFromDate:tempDate];
    NSLog(@"%@", dateFromString);
    id x=dateFromString;
    id y=[NSDecimalNumber numberWithFloat:[retValue.chipCount floatValue]];
    [newData addObject:
     [NSDictionary dictionaryWithObjectsAndKeys:
      x, [NSNumber numberWithInt:CPScatterPlotFieldX], 
      y, [NSNumber numberWithInt:CPScatterPlotFieldY], 
      nil]];
}
plotData = newData;


-(NSUInteger)numberOfRecordsForPlot:(CPPlot *)plot
{
return plotData.count;
}

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

Ответы [ 2 ]

3 голосов
/ 14 апреля 2011

Не бери в голову ...!Я нашел решение для qn.Я заставил свою ось х использовать собственные метки (как это было предложено Рахулом Вьясом).Это решено одной из проблем, с которыми я столкнулся.И для другой проблемы, я попытался получить строку из NSDate, используя NSDateformatter и из строки.Я публикую код ниже.Надеюсь, это поможет кому-то.Код для создания пользовательских меток со временем по оси x, который уже есть в примере с гистограммой.

-(void)configureXAxisForGraph:(CPXYGraph*)graphForAxis
{
 CPXYAxisSet *axisSet = (CPXYAxisSet *)graph.axisSet;
 CPXYAxis *x=axisSet.xAxis;
 x.majorIntervalLength = [[NSDecimalNumber decimalNumberWithString:@"1"] decimalValue];
 CPPlotRange *xAxisRange=[CPPlotRange plotRangeWithLocation:CPDecimalFromString(@"0.0") length:CPDecimalFromString(@"24.0")];
 x.minorTicksPerInterval = 4;
 x.majorTickLineStyle = lineStyle;
 x.minorTickLineStyle = lineStyle;
 x.axisLineStyle = lineStyle;
 x.minorTickLength = 5.0f;
 x.majorTickLength = 7.0f;
 x.visibleRange=xAxisRange;
 x.orthogonalCoordinateDecimal=CPDecimalFromString(@"0");
 x.title=@"Hours";
 x.titleOffset=47.0f;
 x.labelRotation=M_PI/4;
 x.labelingPolicy=CPAxisLabelingPolicyNone;
 NSArray *customTickLocations = [NSArray arrayWithObjects:[NSDecimalNumber numberWithInt:3], [NSDecimalNumber numberWithInt:6], [NSDecimalNumber numberWithInt:9], [NSDecimalNumber numberWithInt:12], 
                                [NSDecimalNumber numberWithInt:15], [NSDecimalNumber numberWithInt:18], [NSDecimalNumber numberWithInt:21], [NSDecimalNumber numberWithInt:24],nil];
 NSArray *xAxisLabels = [NSArray arrayWithObjects:@"3 AM", @"6 AM", @"9 AM", @"12PM", @"3 PM",@"6 PM",@"9 PM", @"12 AM", nil];
 NSUInteger labelLocation = 0;
 NSMutableArray *customLabels = [NSMutableArray arrayWithCapacity:[xAxisLabels count]];
 for (NSNumber *tickLocation in customTickLocations) 
 {
    CPAxisLabel *newLabel = [[CPAxisLabel alloc] initWithText: [xAxisLabels objectAtIndex:labelLocation++] textStyle:x.labelTextStyle];
    newLabel.tickLocation = [tickLocation decimalValue];
    newLabel.offset = x.labelOffset + x.majorTickLength;
    newLabel.rotation = M_PI/4;
    [customLabels addObject:newLabel];
    [newLabel release];
}
 x.axisLabels =  [NSSet setWithArray:customLabels];
}

Вот код, который мне помог с построением значений против числа и времени (час).

self.dataToBePlotted = [NSMutableArray array];
NSUInteger i;
for ( i = 0; i < [dummyDataArray count]; i++ ) 
{
    Chirp *retValue=[[Chirp alloc]init];
    retValue=[dummyDataArray objectAtIndex:i];
    NSDate *tempDate=retValue.startingAt;
    NSString *dateFromString=[dateFormatter1 stringFromDate:tempDate];
    NSLog(@"%@", dateFromString);
    id x=dateFromString;
    id y=[NSDecimalNumber numberWithFloat:[retValue.chipCount floatValue]];
    [self.dataToBePlotted addObject:
     [NSDictionary dictionaryWithObjectsAndKeys:
      x, [NSNumber numberWithInt:CPScatterPlotFieldX], 
      y, [NSNumber numberWithInt:CPScatterPlotFieldY], 
      nil]];
}
self.plotData = self.dataToBePlotted;


 -(NSUInteger)numberOfRecordsForPlot:(CPPlot *)plot
 {  
   return [plotData count];
 } 

-(NSNumber *)numberForPlot:(CPPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index 
{
  NSDecimalNumber *num = [[plotData objectAtIndex:index] objectForKey:[NSNumber numberWithInt:fieldEnum]];
  return num;
}
2 голосов
/ 13 апреля 2011

вам нужно создать пользовательские метки для оси х. посмотрите образец гистограммы основного графика. Он имеет собственные метки. Таким образом, вы можете показать час, дату или что-то еще, что вы хотите.

...