我在Cocoa的Core Plot中遇到CPTBarPlot问题。 也就是说,我无法实现控制条的步宽。 X轴刻度通常设置为1到无穷大的整数,并在其上绘制散点图。
但是,绘制条形图时,首先只有第一列开始(当然有正确的偏移)。第二个是它的勾选,所以是第三个,所有其他如截图所示:
我没有找到任何属性来控制它,但是,我发现了数据源方法
-(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];
我必须补充说,当在同一绘图空间上绘制散点图并且它完全匹配时,正在使用相同的刻度....
答案 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,它还会询问每个柱的基值。