Постоянно показывать метку в источнике, используя дату / время и основной график - PullRequest
1 голос
/ 08 февраля 2012

Я использую базовый график для отображения последних показателей сервера на iPhone / iPad.У меня все правильно, и примерно на 95% выгляжу так, как хочу.Единственное, что меня беспокоит, так это то, что Дата и Время отображаются в виде интервала оси x, и я не вижу большого контроля над тем, с какой точки начинается этот интервал.

Например, у меня в настоящее время основной интервал распечатывает дату / время каждые полчаса.Это означает, что я могу распечатать время по оси X следующим образом: 2/8 12:00 pm 2/8 12:30 pm 2/8 13:00 PM Я хотел бы, чтобы источник графика (текущее время) былначало этого интервала (например, 2/8 11:37 2/8 12:07 вечера 2/8 12:37 вечера).Это возможно?Есть ли какая-нибудь точка начала интервала, которую я могу определить?

Вот соответствующий код:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"M/d h:mm a"];
if([[NSTimeZone systemTimeZone] isDaylightSavingTime]) {
    NSLog(@"DLS");
}

[NSTimeZone resetSystemTimeZone];
[dateFormatter setTimeZone:[NSTimeZone systemTimeZone]];

CPTTimeFormatter *timeFormatter = [[CPTTimeFormatter alloc] initWithDateFormatter:dateFormatter];
timeFormatter.referenceDate = [NSDate dateWithTimeIntervalSinceReferenceDate:0];
axisSet.xAxis.labelFormatter = timeFormatter;

CPTMutableLineStyle *lineStyle = [CPTMutableLineStyle lineStyle];
lineStyle.lineColor = [CPTColor whiteColor];
lineStyle.lineWidth = 2.0f;

axisSet.xAxis.majorIntervalLength = [[NSDecimalNumber decimalNumberWithString:@"50"] decimalValue];
axisSet.xAxis.minorTicksPerInterval = 4;
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;



axisSet.yAxis.majorIntervalLength = [[NSDecimalNumber decimalNumberWithString:@"50"] decimalValue];
axisSet.yAxis.minorTicksPerInterval = 4;
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;

CPTScatterPlot *PowerPlot = [[CPTScatterPlot alloc] initWithFrame:self.view.bounds];
PowerPlot.identifier = @"PowerPlot";

CPTMutableLineStyle *PowerLine = [[CPTMutableLineStyle alloc] init];
[PowerLine setLineColor:[CPTColor redColor]];
[PowerLine setLineWidth:1.0f];
[PowerPlot setDataLineStyle:PowerLine];

PowerPlot.dataSource = self;
[MainGraph addPlot:PowerPlot];

CPTPlotSymbol *greenCirclePlotSymbol = [CPTPlotSymbol ellipsePlotSymbol];
greenCirclePlotSymbol.fill = [CPTFill fillWithColor:[CPTColor greenColor]];
greenCirclePlotSymbol.size = CGSizeMake(2.0, 2.0);
PowerPlot.plotSymbol = greenCirclePlotSymbol;  


 (void)RefreshGraph {
CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)MainGraph.defaultPlotSpace;
NSRange YRange = [self getActiveGraphYRange];
NSInteger YIncrement = YRange.length/10;



long TimeInterval = 0;
switch (CurrentPeriod) {
    case PERIOD_HOUR:
        TimeInterval = OneHour;
        break;
    case PERIOD_DAY:
        TimeInterval = OneDay;
        break;
    case PERIOD_WEEK:
        TimeInterval = OneWeek;
        break;
    case PERIOD_MONTH:
        TimeInterval = OneMonth;
        break;
    default:
        break;
}

long StartTime =  [[NSDate date] timeIntervalSinceReferenceDate];
if([DataPoints count] > 0) {
StartTime = [[(DataPoint *)[DataPoints objectAtIndex:0] Timestamp] timeIntervalSinceReferenceDate];
}
NSInteger XIncrement = TimeInterval/10;
NSInteger XMajorIncrement = XIncrement*5;

CPTXYAxisSet *axisSet = (CPTXYAxisSet *)MainGraph.axisSet;
axisSet.xAxis.majorIntervalLength = [[NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%d",XMajorIncrement]] decimalValue];
if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(StartTime - XIncrement- (XIncrement/3)) length:CPTDecimalFromFloat(TimeInterval + (2*XIncrement))];
}
else{
    plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(StartTime - XIncrement) length:CPTDecimalFromFloat(TimeInterval + (2*XIncrement))];
}
axisSet.yAxis.orthogonalCoordinateDecimal = CPTDecimalFromFloat(StartTime - XIncrement/5);

//axisSet.yAxis.

if([TypeControl selectedSegmentIndex] == 0) { //Power
    if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
        plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(-40) length:CPTDecimalFromFloat(YRange.length+40)];
        axisSet.yAxis.visibleRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0) length:CPTDecimalFromFloat(YRange.length+15)];
        axisSet.yAxis.majorIntervalLength = [[NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%d",YIncrement]] decimalValue];

    }
    else{
        plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(-15) length:CPTDecimalFromFloat(YRange.length+15)];
        axisSet.yAxis.visibleRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0) length:CPTDecimalFromFloat(YRange.length+15)];
        axisSet.yAxis.majorIntervalLength = [[NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%d",YIncrement]] decimalValue];
    }
    axisSet.xAxis.orthogonalCoordinateDecimal = CPTDecimalFromFloat(0);

} else { //Temp
    if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
        plotSpace.yRange = 
        [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(-4) length:CPTDecimalFromFloat(35)];

        axisSet.yAxis.visibleRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0) length:CPTDecimalFromFloat(35)];
        axisSet.yAxis.majorIntervalLength = [[NSDecimalNumber decimalNumberWithString:@"4"] decimalValue];
    }
    else{
        plotSpace.yRange = 
        [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(-2) length:CPTDecimalFromFloat(35)];

        axisSet.yAxis.visibleRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0) length:CPTDecimalFromFloat(35)];
        axisSet.yAxis.majorIntervalLength = [[NSDecimalNumber decimalNumberWithString:@"1"] decimalValue];
    }
    axisSet.xAxis.orthogonalCoordinateDecimal = CPTDecimalFromFloat(0);
}    

[MainGraph reloadData];    
}

1 Ответ

2 голосов
/ 09 февраля 2012

Поскольку вы используете политику маркировки по умолчанию (CPTAxisLabelingPolicyFixedInterval), вы можете использовать свойство labelingOrigin на оси для управления началом маркировки. Установите начальный location диапазона графика.

...