Основной сюжет majorIntervalLength: не удалось заставить его работать

Я пытаюсь построить простой график (не может быть так сложно! Раньше я успешно использовал основной график!). У меня есть несколько дат, которые нужно отложить по оси X. И несколько небольших значений с плавающей запятой по оси Y, например 0,139503, 0,139481 и т. д. Мне нужно построить 5 таких значений (которые я получаю из бэкэнда). Для диапазона оси Y я нахожу наименьшее из этих значений и устанавливаю его в качестве начала диапазона оси Y. И я устанавливаю majorIntervalLength на (highestValue - LowestValue)/5, что составляет (например) 0,007946. Но интервал оси Y кажется фиксированным с интервалом 1. Итак, поскольку мои значения оси Y действительно малы (разница между ними составляет порядка 0,01), все графики рисуются при y = 0,0. Вот фрагмент кода:

-(void) initializeGraph {


    if ((self.graph == nil) || (self.graph == NULL)) {

        self.graphHostView = [(CPTGraphHostingView *) [CPTGraphHostingView alloc] initWithFrame:self.view.bounds];

        self.graph = [[CPTXYGraph alloc] initWithFrame:self.graphHostView.bounds];
    graph.paddingLeft   = 2.0;
    graph.paddingRight  = 2.0;
    graph.paddingTop    = 2.0;
    graph.paddingBottom = 2.0;
    graph.title = @"Graph Plot";

    // plotting style is set to line plots
    CPTMutableLineStyle *lineStyle = [CPTMutableLineStyle lineStyle];
    lineStyle.lineColor = [CPTColor blackColor];
    lineStyle.lineWidth = 2.0f;

    CPTXYAxisSet *axisSet = (CPTXYAxisSet *) self.graph.axisSet;
    axisSet.xAxis.majorTickLineStyle = lineStyle;
    axisSet.xAxis.majorTickLength = 7.0f;
    axisSet.xAxis.labelingPolicy = CPTAxisLabelingPolicyEqualDivisions;
    axisSet.yAxis.labelingPolicy = CPTAxisLabelingPolicyEqualDivisions;
    axisSet.xAxis.labelRotation = 90.0;
    CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *) self.graph.defaultPlotSpace;
    // Determine the lowest and highest values to be plotted in Y Axis)
    CGFloat yLow = 0.1;
    CGFloat yHigh = yLow;
    for (int i=0 ; i<self.dict.count ; i++) {
        MyCustomObject *myData = (MyCustomObject *) [dict objectForKey:
                                                           [self.arrayKeys objectAtIndex:i]];

        if (myData.mem < yLow) {
            yLow = myData.mem;
        }
        if (yHigh < myData.mem) {
            yHigh = myData.mem;
        }
    }
    plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0)
                                                  length:CPTDecimalFromFloat(5)];
    plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(yLow)
                                                    length:CPTDecimalFromFloat(5)];

    // To determine the point where your graph starts
    //axisSet.yAxis.orthogonalCoordinateDecimal = CPTDecimalFromFloat(yLow);
    axisSet.yAxis.majorIntervalLength = CPTDecimalFromCGFloat((yHigh-yLow)/5.0);
    NSLog(@"Y axis interval : %f", (yHigh-yLow)/5.0);
    ...
}

-(NSNumber *) numberForPlot:(CPTPlot *)plot
                  field:(NSUInteger)fieldEnum
            recordIndex:(NSUInteger)index {
    if ( fieldEnum == CPTScatterPlotFieldY ) {
        return [NSNumber numberWithFloat:myData.mem];
    } else {
        return [NSNumber numberWithInt:index];
    }
}

Почему этот параметр majorIntervalLength для оси Y не работает?


person Jean    schedule 03.05.2013    source источник


Ответы (2)


Вы где-нибудь устанавливаете axisSet.yAxis.majorTickLength? я не вижу этого в вашем коде выше.

если majorTickLength равен нулю, ничего не будет отображаться для тика.

person andrew lattis    schedule 03.05.2013
comment
Пытался, Андрей, зря. По-прежнему получается только одна прямая линия. мои примерные значения на этот раз для оси Y составляют 0,202995,0,202972,0,203030,0,203053,0,203205, и я установил yAxis.majorIntervalLength на 0,020000, а yAxis.majorTickLength = 5,0f. На самом деле он должен отображать тонкие вариации значений по оси Y, но кажется, что все значения по оси Y отображаются как 0,2 в виде прямой линии, потому что на графике показаны интервалы в 0,1,2,3,4, а не длина интервала 0,02. - person Jean; 03.05.2013
comment
Я думаю, что неправильно понял ваш вопрос, похоже, что галочки появляются. но ваш диапазон y слишком велик. если все ваши значения находятся в диапазоне от .2 до .3, попробуйте установить диапазон оси Y на длину .1 . очевидно, вы хотели бы рассчитать это, но просто жесткое кодирование должно проверить, не в этом ли проблема - person andrew lattis; 03.05.2013
comment
@andrewlattis прав насчет диапазона сюжета. Попробуйте установить длину yRange на yHigh - yLow. - person Eric Skroch; 04.05.2013
comment
Спасибо, andrewlattis, Эрик Скроч. Эврика! Понятно! :) Так полегчало! - person Jean; 04.05.2013

Установка длины yRange (как предложил Эрик Скроч) на (yHigh-yLow) помогла

person Jean    schedule 04.05.2013