在核心图的CPTBarPlot中未与X轴对齐的条形标记

时间:2011-12-07 08:58:37

标签: cocoa core-plot

我在Cocoa的Core Plot中遇到CPTBarPlot问题。 也就是说,我无法实现控制条的步宽。 X轴刻度通常设置为1到无穷大的整数,并在其上绘制散点图。

但是,绘制条形图时,首先只有第一列开始(当然有正确的偏移)。第二个是它的勾选,所以是第三个,所有其他如截图所示:

enter image description here

我没有找到任何属性来控制它,但是,我发现了数据源方法

-(NSNumber *)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index

与绘制散点图时的行为不同。也就是说,它只枚举整数3,即CPTBarPlotBindingBarTips并且不枚举任何其他常量,我特别为缺少CPTBarPlotBindingBarLocations而烦恼。

如果我从Plot Gallery mac演示项目启动VerticalBarChart,我已经检查并看到相同的方法以相同的顺序枚举3,4和2个常量。

我正在使用Core Plot 0.9,我相信与此演示相同。仍然...

如何解决这个问题?

以下是X轴上标签和刻度的完整代码;

    x.labelRotation = M_PI/4;
    x.labelingPolicy = CPTAxisLabelingPolicyNone;
    x.labelOffset = 0.0;

    CPTMutableTextStyle *labelStyle = [CPTMutableTextStyle textStyle];
    labelStyle.fontSize = 9.0;
    x.labelTextStyle = labelStyle;

//    NSMutableArray *dateArray = [dataSeries objectAtIndex:0];
    NSMutableArray *customTickLocations = [NSMutableArray array];
    NSMutableArray *xAxisLabels = [NSMutableArray array];

    for (int i=0;i<[dataSeries count];i++) {

        [customTickLocations addObject:[NSDecimalNumber numberWithInt:i+1]];
        [xAxisLabels addObject:[dataSeries objectAtIndex:i]];

    }

    //    [customTickLocations addObject:[NSDecimalNumber numberWithInt:[dateArray count]]];

    NSUInteger labelLocation = 0;
    NSMutableArray *customLabels = [NSMutableArray arrayWithCapacity:[xAxisLabels count]];
    for (NSNumber *tickLocation in customTickLocations) {
        CPTAxisLabel *newLabel = [[CPTAxisLabel 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 setMajorTickLocations:[NSSet setWithArray:customTickLocations]];

    x.axisLabels =  [NSSet setWithArray:customLabels];

我必须补充说,当在同一绘图空间上绘制散点图并且它完全匹配时,正在使用相同的刻度....

1 个答案:

答案 0 :(得分:2)

field参数将是此枚举的成员之一:

typedef enum _CPTBarPlotField {
    CPTBarPlotFieldBarLocation = 2, ///< Bar location on independent coordinate axis.
    CPTBarPlotFieldBarTip      = 3, ///< Bar tip value.
    CPTBarPlotFieldBarBase     = 4  ///< Bar base (used only if barBasesVary is YES).
} CPTBarPlotField;

如果绘图的plotRange属性为nil(默认值),则绘图将向数据源询问每个条的位置和提示。如果barBasesVary == YES,它还会询问每个柱的基值。