2013-11-07 3 views
0

У меня есть 2 графика, которые я показываю в контроллере вида. Ось y - это значение времени, записанное и x данные, затухание ветра, порыв, среднее. Моя проблема в том, что сбор данных в моем массиве длится около 8-10 часов. поэтому когда-то первое значение будет 19:00 ночью, а последнее будет сказано 05:00 утра. Теперь, если я попытаюсь поместить это в диаграмму рассеяния, данные будут повсюду, а не в последовательности. если я просто использую номер индекса массивов, который он красиво рисует, но данные не всегда хронологические, иногда может пройти час, где нет данных. Когда я меняю ось y на записанное значение времени, я конвертирую, чтобы сказать 19,0 и 5,0 от HH: mm: ss и в примере выше, и график неправильный, как вы можете видеть ниже. Я добавил пользовательские метки и т. Д. На ось y, но вам нужен способ сделать его линейным?Программное решение для пользовательской оси y

enter image description here

EDIT:

я хочу для оси х, чтобы выглядеть, как показано ниже, за исключением числа осей работает, как показано ниже, когда данные предыдущий день и текущий день ??:

19 , 20,21,22,23,24,1,2,3,4,5,6

В настоящее время у меня есть петля этикетки клиента, чтобы сделать именно это, но данные все еще обтекают?

plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat([xFirstEntry integerValue]) length:CPTDecimalFromFloat(10.5)]; 
plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0) length:CPTDecimalFromFloat([yMaxValue integerValue]+12)]; 
plotSpace.globalXRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble([xFirstEntry integerValue]) length:CPTDecimalFromDouble(10.5)]; 
plotSpace.globalYRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0) length:CPTDecimalFromDouble([yMaxValue doubleValue]*1.23)]; 


CPTXYAxisSet *axisSet = (CPTXYAxisSet *)graph.axisSet; 
CPTXYAxis *x = axisSet.xAxis; 
x.majorIntervalLength = [[NSDecimalNumber decimalNumberWithString:@"1"] decimalValue]; 
x.axisConstraints = [CPTConstraints constraintWithLowerOffset:0]; 
x.labelingPolicy = CPTAxisLabelingPolicyNone; 
xFirstEntry = [[[changedArray objectAtIndex:0]objectForKey:@"date"] substringFromIndex:11]; 
xFirstEntry = [xFirstEntry substringToIndex:[xFirstEntry length] - 6]; 
xLastEntry = [[[changedArray objectAtIndex:changedArray.count-1]objectForKey:@"date"] substringFromIndex:11]; 
xLastEntry = [xLastEntry substringToIndex:[xLastEntry length] - 6]; 
NSLog(@"%@ %@", xFirstEntry, xLastEntry); 
NSMutableArray *xCustomTickLocations = [[NSMutableArray alloc]init]; 
NSMutableArray *xCustomAxisLabels = [[NSMutableArray alloc]init]; 
NSInteger newValue = [xFirstEntry integerValue]; 
if ([xFirstEntry integerValue] > [xLastEntry integerValue]) { 
    NSLog(@"gretaer than"); 
    while (newValue <= 24) { 
     [xCustomTickLocations addObject:[NSDecimalNumber numberWithInt:newValue]]; 
     [xCustomAxisLabels addObject:[NSString stringWithFormat:@"%d",newValue]]; 
     newValue++; 
    } 
    newValue = 1; 
    [xCustomTickLocations addObject:[NSDecimalNumber numberWithInt:newValue]]; 
    [xCustomAxisLabels addObject:[NSString stringWithFormat:@"%d",newValue]]; 
    while (newValue <= [xLastEntry integerValue]+1) { 
     [xCustomTickLocations addObject:[NSDecimalNumber numberWithInt:newValue]]; 
     [xCustomAxisLabels addObject:[NSString stringWithFormat:@"%d",newValue]]; 
     newValue++; 
    } 
} 
else { 
    NSLog(@"less than"); 
    while (newValue <= [xLastEntry integerValue]+1) { 
     [xCustomTickLocations addObject:[NSDecimalNumber numberWithInt:newValue]]; 
     [xCustomAxisLabels addObject:[NSString stringWithFormat:@"%d",newValue]]; 
     newValue++; 
    } 
} 
NSUInteger XlabelLocation = 0; 
CPTMutableTextStyle *xLabelStyle = [CPTMutableTextStyle textStyle]; 
xLabelStyle.color = [[CPTColor whiteColor] colorWithAlphaComponent:1]; 
xLabelStyle.fontName = @"Helvetica-Bold"; 
xLabelStyle.fontSize = 9.0f; 

NSMutableArray *XcustomLabels = [NSMutableArray arrayWithCapacity:[xCustomAxisLabels count]]; 
for (NSNumber *XtickLocation in xCustomTickLocations) { 
    CPTAxisLabel *newLabel = [[CPTAxisLabel alloc] initWithText: [xCustomAxisLabels objectAtIndex:XlabelLocation++] textStyle:xLabelStyle]; 
    newLabel.tickLocation = [XtickLocation decimalValue]; 
    newLabel.offset = 2; 
    newLabel.rotation=M_PI_2; 
    [XcustomLabels addObject:newLabel]; 
} 
x.axisLabels = [NSSet setWithArray:XcustomLabels]; 

ответ

1

Существует несколько возможных решений. Какой из них проще всего зависит от того, как хранятся данные и как пользователь может взаимодействовать с графиком.

  1. Вы можете сломать линию, чтобы она не обертывалась вокруг. Вставьте «фиктивную» точку данных в индекс, который падает после вашей последней точки в день и до первого дня на следующий день. Верните nil или NAN для значений данных в этом индексе, чтобы разбить линию.

  2. Установите ось x как временную шкалу, которая начинается в один день и заканчивается на следующем. Либо используйте один из форматировщиков, встроенных в Core Plot, либо создайте метки пользовательских осей для отображения времени.

+0

извините, вероятно, не объясниться должным образом. добавили изображение того, как я хотел бы его посмотреть, кроме 19,20,21,22,23,24,1,2,3,4,5,6 – veggyaurus

+0

Используйте вариант №2 в своем ответе (шкала времени) , Установите ось 'xRange', чтобы начать с 1900 в первый день и иметь длину 11 часов. –

0

Ниже приведен код, который я использовал для моего решения:

Определение графика:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]]; 
[dateFormatter setDateFormat:@"yyy-MM-dd HH:mm:ss"]; 
NSDate *firstDate = [dateFormatter dateFromString:[[changedArray objectAtIndex:0]objectForKey:@"date"]]; 
NSDate *lastDate = [dateFormatter dateFromString:[[changedArray objectAtIndex:changedArray.count-1]objectForKey:@"date"]]; 
NSNumber *difference = [NSDecimalNumber numberWithDouble:[lastDate timeIntervalSinceDate:firstDate]]; 

CPTXYPlotSpace *plotSpace2 = (CPTXYPlotSpace *) graph2.defaultPlotSpace; 
plotSpace2.allowsUserInteraction = YES; 
plotSpace2.delegate = self; 
plotSpace2.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0) length:CPTDecimalFromInteger([difference integerValue]*1.03)]; 
plotSpace2.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0) length:CPTDecimalFromFloat(9)]; 
plotSpace2.globalXRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0) length:CPTDecimalFromInteger([difference integerValue]*1.03)]; 
plotSpace2.globalYRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0) length:CPTDecimalFromFloat(10)]; 

Создание этикетки и отметьте места:

xFirstEntry = [[[changedArray objectAtIndex:0]objectForKey:@"date"] substringFromIndex:11]; 
xFirstEntry = [xFirstEntry substringToIndex:[xFirstEntry length] - 6]; 
xLastEntry = [[[changedArray objectAtIndex:changedArray.count-1]objectForKey:@"date"] substringFromIndex:11]; 
xLastEntry = [xLastEntry substringToIndex:[xLastEntry length] - 6]; 

NSMutableArray *x2MajorLocations = [[NSMutableArray alloc]init]; 
NSMutableArray *x2MinorLocations = [[NSMutableArray alloc]init]; 
NSMutableArray *x2Labels = [[NSMutableArray alloc]init]; 
int newValue = [xFirstEntry integerValue]; 
NSNumber *x2MajorDataPoint = [NSNumber numberWithInt:(newValue)]; 
NSNumber *x2MinorDataPoint = [NSNumber numberWithInt:(newValue)]; 
while (newValue <= [xLastEntry integerValue]+1) { 
    x2MinorDataPoint = @([x2MajorDataPoint integerValue] + 1800); 
    NSNumber *x2LabelValue = [NSNumber numberWithInt:newValue]; 
    CPTAxisLabel *label = [[CPTAxisLabel alloc] initWithText:[x2LabelValue stringValue] textStyle:xLabelStyle]; 
    label.tickLocation = CPTDecimalFromInt([x2MajorDataPoint intValue]); 
    label.offset = 4; 

    [x2Labels addObject:label]; 
    [x2MajorLocations addObject:x2MajorDataPoint]; 
    [x2MinorLocations addObject:x2MinorDataPoint]; 

    newValue++; 
    x2MajorDataPoint = @([x2MajorDataPoint integerValue] + 3600); 
} 
x2.labelingPolicy = CPTAxisLabelingPolicyNone; 
x2.axisLabels = [NSSet setWithArray:x2Labels]; 
x2.majorTickLocations = [NSSet setWithArray:x2MajorLocations]; 
x2.minorTickLocations = [NSSet setWithArray:x2MinorLocations]; 

Что мой numberForPlot : выглядели после цепочки:

case CPTScatterPlotFieldX: 
     if (index < valueCount) { 
      NSDateFormatter *formatter = [[NSDateFormatter alloc]init]; 
      [formatter setDateFormat:@"yyy-MM-dd HH:mm:ss"]; 
      NSDate *firstDate = [formatter dateFromString:[[changedArray objectAtIndex:0]objectForKey:@"date"]]; 
      NSDate *newDate = [formatter dateFromString:[[changedArray objectAtIndex:index]objectForKey:@"date"]]; 
      return [NSDecimalNumber numberWithDouble:[newDate timeIntervalSinceDate:firstDate]]; 
     } 
     break; 

И что это было похоже без моих пользовательских меток в верхней части, и обычай в нижней части:

enter image description here

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