2
我正在嘗試創建一個類似於下圖的條形圖 - x軸有兩個不同的標籤 - 一個是條形自身的標籤,表示性能,另一個位於軸的底部,表示年份。只有數字需要顯示在圖上而不是頂部。如何在帶有coreplot的條形圖上同時使用自定義標籤和單獨條形標籤?
我通過創建自定義的標籤顯示了多年。通過實施-dataLabelForPlot:recordIndex:
方法,我也能夠顯示酒吧的表現數據。性能數據顯示但水平,但我想能夠旋轉90度的性能數字。 在圖上設置labelRotation
並不會幫助,因爲我已將labelingPolicy
設置爲CPTAxisLabelingPolicyNone
,因此我可以添加自定義標籤。
下面是我的代碼:
-(CPTLayer *)dataLabelForPlot:(CPTPlot *)plot recordIndex:(NSUInteger)index
{
CPTMutableTextStyle *axisTitleTextStyle = [CPTMutableTextStyle textStyle];
axisTitleTextStyle.fontSize = 10.0;
axisTitleTextStyle.color = [CPTColor blackColor];
CPTTextLayer *label = [[CPTTextLayer alloc] init];
label.textStyle = axisTitleTextStyle;
if ([plot isKindOfClass:[CPTBarPlot class]]) {
if ([plot.identifier isEqual:@"Fund"]) {
label.text = [[[self dataGroup1] objectAtIndex:index] stringValue];
}
else if ([plot.identifier isEqual:@"Benchmark"]) {
label.text = [[[self dataGroup2] objectAtIndex:index] stringValue];
}
}
return [label autorelease];
}
- (void) drawGraph
{
graphHostingView_ = [[CPTGraphHostingView alloc] initWithFrame:self.bounds];
calPerfGraph_ = [[CPTXYGraph alloc] initWithFrame:self.bounds];
graphHostingView_.hostedGraph = calPerfGraph_;
[self addSubview:graphHostingView_];
calPerfGraph_.plotAreaFrame.masksToBorder = NO;
calPerfGraph_.paddingLeft = 5.0;
calPerfGraph_.paddingTop = 20.0;
calPerfGraph_.paddingRight = 10.0;
calPerfGraph_.paddingBottom =20.0;
calPerfGraph_.plotAreaFrame.paddingTop = 10.0;
calPerfGraph_.plotAreaFrame.paddingBottom = 50.0;
calPerfGraph_.plotAreaFrame.paddingLeft = 10.0;
calPerfGraph_.plotAreaFrame.paddingRight = 35.0;
// Y axis scale - round to nearest ten
int maxYScale = (([[self getPositiveMax] intValue]/10) + 1) * 10;
int minYScale = (([[self getNegativeMax] intValue]/10) + 1) * 10;
// Styles
CPTMutableLineStyle *lineStyle = [CPTMutableLineStyle lineStyle];
lineStyle.lineColor = [CPTColor grayColor];
lineStyle.lineWidth = 2.0f;
CPTMutableLineStyle *gridLineStyle = [CPTMutableLineStyle lineStyle];
gridLineStyle.lineColor = [CPTColor grayColor];
gridLineStyle.lineWidth = 1.0f;
// X axis
CPTXYAxisSet *axisSet = (CPTXYAxisSet *)calPerfGraph_.axisSet;
axisSet.xAxis.minorTicksPerInterval = 0;
axisSet.xAxis.majorTickLineStyle = lineStyle;
axisSet.xAxis.axisLineStyle = lineStyle;
axisSet.xAxis.majorTickLength = 0;
axisSet.xAxis.labelingPolicy = CPTAxisLabelingPolicyNone;
axisSet.xAxis.axisConstraints = [CPTConstraints constraintWithLowerOffset:0]; // Bring labels to the bottom on the plot
axisSet.xAxis.labelRotation = M_PI/2;
int currentYear = [self getCurrentYear];
NSMutableArray *customLabels = [NSMutableArray arrayWithCapacity:6];
for (int i=currentYear-5,count=1; currentYear>=i; i++,count++) {
CPTAxisLabel *newLabel = [[CPTAxisLabel alloc] initWithText:[NSString stringWithFormat:@"%d",i] textStyle:axisSet.xAxis.labelTextStyle];
newLabel.tickLocation = CPTDecimalFromInt(count);
newLabel.offset = axisSet.xAxis.labelOffset + axisSet.xAxis.majorTickLength;
[customLabels addObject:newLabel];
[newLabel release];
}
axisSet.xAxis.axisLabels = [NSSet setWithArray:customLabels];
// Y axis
if (maxYScale >= 40 || minYScale >= 40) {
axisSet.yAxis.majorIntervalLength = [[NSDecimalNumber decimalNumberWithString:@"20"] decimalValue];
}
else {
axisSet.yAxis.majorIntervalLength = [[NSDecimalNumber decimalNumberWithString:@"10"] decimalValue];
}
axisSet.yAxis.minorTicksPerInterval = 0;
axisSet.yAxis.majorTickLength = 0;
axisSet.yAxis.majorGridLineStyle = gridLineStyle;
axisSet.yAxis.axisLineStyle = nil;
axisSet.yAxis.axisConstraints = [CPTConstraints constraintWithUpperOffset:0]; // Bring labels to the right end of the plot
axisSet.yAxis.tickDirection = CPTSignPositive;
CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)calPerfGraph_.defaultPlotSpace;
plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) length:CPTDecimalFromDouble([[self calPerfFundData] count]+1)];
plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(-minYScale) length:CPTDecimalFromDouble(minYScale + maxYScale)];
CPTBarPlot *barPlot = [CPTBarPlot tubularBarPlotWithColor:[CPTColor greenColor] horizontalBars:NO];
barPlot.baseValue = CPTDecimalFromString(@"0");
barPlot.dataSource = self;
barPlot.barOffset = CPTDecimalFromFloat(.7);
barPlot.identifier = @"Fund";
barPlot.barWidth = CPTDecimalFromFloat(.25);
[barPlot addAnimation:[self animateVerticalBars] forKey:@"FundAnimation"];
[calPerfGraph_ addPlot:barPlot toPlotSpace:plotSpace];
CPTBarPlot *bbarPlot = [CPTBarPlot tubularBarPlotWithColor:[CPTColor colorWithComponentRed:0.9 green:0.9 blue:0.9 alpha:0.8] horizontalBars:NO];
bbarPlot.baseValue = CPTDecimalFromString(@"0");
bbarPlot.dataSource = self;
bbarPlot.barOffset = CPTDecimalFromFloat(1);
bbarPlot.barWidth = CPTDecimalFromFloat(.25);
bbarPlot.identifier = @"Benchmark";
[bbarPlot addAnimation:[self animateVerticalBars] forKey:@"BenchmarkAnimation"];
[calPerfGraph_ addPlot:bbarPlot toPlotSpace:plotSpace];
}
如何旋轉上槓表現人物?任何幫助表示讚賞。 謝謝。
謝謝埃裏克。在劇情上設置此屬性的作品。 – EmmKay