【问题标题】:Core plot majorIntervalLength : unable to make it work核心情节majorIntervalLength:无法使其工作
【发布时间】:2013-05-03 12:01:44
【问题描述】:

我正在尝试绘制一个简单的图表(不能这么难!我之前已经成功使用过核心图!)。我有一些日期要绘制在 x 轴上。还有一些 y 轴上的小浮点值,比如 0.139503、0.139481 等。我必须绘制 5 个这样的值(我从后端获取)。 对于 y 轴范围,我找到这些值中的最低值并将其设置为 y 轴范围的开始。并将majorIntervalLength 设置为(highestValue - LowestValue)/5,即(例如)0.007946。但是 y 轴间隔似乎固定为 1。所以,由于我的 y 轴值非常小(它们之间的差异在 0.01 左右),所有图都在 y=0.0 处绘制。这是代码 sn-p :

-(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];
    }
}

为什么设置的 y 轴的 majorIntervalLength 不起作用?

【问题讨论】:

    标签: iphone ios objective-c core-plot


    【解决方案1】:

    您是否在任何地方设置axisSet.yAxis.majorTickLength?我在上面的代码中没有看到它。

    如果majorTickLength 为nil,则刻度不会显示任何内容。

    【讨论】:

    • 试过了,安德鲁,徒劳无功。仍然只有一条直线。这次我的 y 轴样本值为 0.202995,0.202972,0.203030,0.203053,0.203205,我将 yAxis.majorIntervalLength 设置为 0.020000,yAxis.majorTickLength = 5.0f。它实际上应该绘制 y 轴值的细微变化,但它似乎将 0.2 处的所有 y 轴值绘制为一条直线,因为该图显示的是 0、1、2、3、4 的间隔,而不是间隔长度为 0.02。
    • 我想我看错了你的问题,听起来刻度标签正在显示。但是你的 y 范围太大了。如果您的值都在 .2-.3 之间,请尝试将 y 轴范围设置为 .1 的长度。显然你想计算一下,但只是硬编码它应该验证这是否是问题
    • @andrewlattis 关于情节范围是正确的。尝试将yRange 的长度设置为yHigh - yLow
    • 谢谢,andrewlattis,Eric Skroch。尤里卡!知道了! :) 松了一口气!
    【解决方案2】:

    将 yRange 的长度(如 Erik Skroch 建议的那样)设置为 (yHigh-yLow) 有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      相关资源
      最近更新 更多