核心图的自定义轴标签 [英] Custom axis labels for Core Plot

查看:221
本文介绍了核心图的自定义轴标签的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我花了一个多星期试图为Core Plot制作自定义轴标签,但没有成功。我阅读了许多教程和示例SO,并试图在我的项目中复制,但没有成功。请帮助。

I spent more than a week trying to have custom axis label for Core Plot, without success. I read many tutorials and examples on SO, and tried to replicate it in my project, but no success. Please help.

这是我有的代码:

// Create an CPXYGraph and host it inside the view
CPTTheme *theme = [CPTTheme themeNamed:kCPTPlainWhiteTheme];
CPTXYGraph *graph = (CPTXYGraph *)[theme newGraph];
hostView.hostedGraph = graph;

graph.paddingTop = 10.0;
graph.paddingLeft = 10.0;
graph.paddingRight = 10.0;
graph.paddingBottom = 10.0;

[graph.plotAreaFrame setPaddingTop:10.0f];
[graph.plotAreaFrame setPaddingLeft:55.0f];
[graph.plotAreaFrame setPaddingRight:10.0f];
[graph.plotAreaFrame setPaddingBottom:35.0f];

// Set up Plot Space
CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)graph.defaultPlotSpace;
plotSpace.allowsUserInteraction = YES;
plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromInteger(800)
                                               length:CPTDecimalFromInteger(400)];
plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromCGFloat(7000)
                                               length:CPTDecimalFromCGFloat(1000)];

// Set up Axes
CPTXYAxisSet *axisSet = (CPTXYAxisSet *)graph.axisSet;

CPTXYAxis *x = axisSet.xAxis;
x.majorIntervalLength = CPTDecimalFromInteger(60);
x.orthogonalCoordinateDecimal = CPTDecimalFromInteger(7000);
x.minorTicksPerInterval = 3;
x.borderWidth = 0;
x.majorTickLength = 5.0f;
x.minorTickLength = 2.0f;
x.axisLineCapMax = [CPTLineCap openArrowPlotLineCap];
x.axisLineCapMax.size = CGSizeMake(8, 10);

x.labelingPolicy = CPTAxisLabelingPolicyAutomatic;

NSMutableSet *xLabels = [NSMutableSet setWithCapacity:[self.arrXValues count]];
NSMutableSet *xLocations = [NSMutableSet setWithCapacity:[self.arrXValues count]];

CGFloat location = 0.0;
for (NSString *string in self.arrXValues) {
    CPTAxisLabel *label = [[CPTAxisLabel alloc] initWithText:string  textStyle:x.labelTextStyle];
    location++;
    label.tickLocation = CPTDecimalFromCGFloat(location);
    label.offset = x.titleOffset + x.majorTickLength;
    if (label) {
        [xLabels addObject:label];
        [xLocations addObject:[NSNumber numberWithFloat:location]];
    }
}
x.axisLabels = xLabels;
x.majorTickLocations = xLocations;

CPTXYAxis *y = axisSet.yAxis;
y.majorIntervalLength = CPTDecimalFromCGFloat(250);
y.minorTicksPerInterval = 5;
y.orthogonalCoordinateDecimal = CPTDecimalFromInteger(800);
y.majorTickLength = 5.0f;
y.minorTickLength = 2.0f;
y.axisLineCapMax = [CPTLineCap openArrowPlotLineCap];
y.axisLineCapMax.size = CGSizeMake(8, 10);

// Set up the chart
CPTScatterPlot *linePlot = [[CPTScatterPlot alloc] init];
linePlot.identifier = @"AAPL";
CPTMutableLineStyle *lineStyle = [linePlot.dataLineStyle mutableCopy];
lineStyle.lineWidth = 2.f;
lineStyle.lineColor = [CPTColor blueColor];
linePlot.dataLineStyle = lineStyle;

linePlot.dataSource = self;
[graph addPlot:linePlot];

这是我的数据结构:

self.arrXValues = [NSMutableArray arrayWithObjects:@"900", @"930", @"1000", @"1010", @"1020", @"1030", @"1040", @"1050", @"1100", @"1130", nil];
self.arrYValues = [NSMutableArray arrayWithObjects:@"7600", @"7460", @"7700", @"7720", @"7680", @"7700", @"7720", @"7720", @"7680", @"7700", nil];

如果我将labelingPolicy转为CPTAxisLabelingPolicyAutomatic,它将显示默认标签,但至少确认标签不被其他东西隐藏。

If I turn labelingPolicy to CPTAxisLabelingPolicyAutomatic, it will show the default labels, but at least affirms that the labels are not hidden by something else. Unfortunately, I don't have enough reputations to post images.

请帮助找出错误,必须在那里出现。

Please help spot the mistake, there must something silly out there.

推荐答案

您将自定义标签定位在可见图范围之外。 xRange 涵盖介于800和1,200之间的值( length of 400)。标签为1,2,3等。将标签值用作 tickLocation

You're positioning the custom labels outside the visible plot range. The xRange covers values between 800 and 1,200 (length of 400). The labels are at 1, 2, 3, etc. Use the label value as the tickLocation:

label.tickLocation = CPTDecimalFromString(string);
[xLocations addObject:string];

这篇关于核心图的自定义轴标签的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆