2012-10-07 183 views
4

我正在使用核心圖條形圖繪製公司的增長率。我希望將公司的股票代碼作爲標籤,以x軸爲中心,位於的下方。不幸的是,我花了很多時間尋找一種方法來正確地將x標籤居中,但是使用我的代碼沒有成功。我怎樣才能讓x軸標籤正確居中?核心圖:x軸上的自定義標籤條形圖

我的圖表設置是如下:

CPTBarPlot *barPlot  = [CPTBarPlot tubularBarPlotWithColor:[CPTColor blueColor] horizontalBars:NO]; 

barPlot.baseValue  = CPTDecimalFromInt(0); 
barPlot.barOffset  = CPTDecimalFromFloat(0.5f); 
barPlot.barWidth  = CPTDecimalFromFloat(0.5f); 

double xAxisStart = 0; 
double xAxisLength = self.companies.count; 

double yAxisStart = 0; 
double yAxisLength = 0.5; 

CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)graph.defaultPlotSpace; 
plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(xAxisStart) length:CPTDecimalFromDouble(xAxisLength + 1.0)] ; 
plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(yAxisStart) length:CPTDecimalFromDouble(yAxisLength)] ; 

barPlot.plotRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(+0.0) length:CPTDecimalFromDouble(xAxisLength)] ; 

在下面的代碼片段中,我試圖用自定義標籤,但沒有成功。如下圖示例圖表。

xAxis.labelingPolicy = CPTAxisLabelingPolicyNone; 

NSMutableArray *customLabels = [[NSMutableArray alloc]init]; 

[self.companies enumerateObjectsUsingBlock:^(IBCompany *company, NSUInteger idx, BOOL *stop) { 
    NSString *labelText = company.contrSymbol; 
    CPTAxisLabel *label = [[CPTAxisLabel alloc] initWithText:labelText textStyle:xAxis.labelTextStyle]; 
    label.tickLocation = CPTDecimalFromDouble(idx + 0.5); 
    label.offset = xAxis.labelOffset + xAxis.majorTickLength; 
    label.rotation = M_PI * 2; 
    [customLabels addObject:label]; 
    }]; 
    xAxis.axisLabels = [NSSet setWithArray:customLabels]; 

barcharts with incorrect label positioning

請注意,我對條形圖指數與開始:

-(NSArray *)numbersForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndexRange:(NSRange)indexRange 
    { 
    if ([plot.identifier isEqual:plotIdentifier]) {; 

    if (fieldEnum == CPTScatterPlotFieldX) { 
     NSMutableArray *indexArray = [[NSMutableArray alloc] init]; 

     [self.companies enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
      [indexArray addObject:[NSDecimalNumber numberWithInt: idx + 1]]; 
     }]; 
     return [indexArray copy]; 
    } 
    else if (fieldEnum == CPTScatterPlotFieldY) { 
     // .. 
    } 
} 
else return nil; // should be considered as ERROR 

}

回答

5
  1. 您應當使用習慣得到dat中右側圖的字段標識符來源。對於條形圖,您應該使用CPTBarPlotFieldBarLocationCPTBarPlotFieldBarTip。在這種情況下,沒有任何區別,但對於其他類型的地塊並非總是如此。例如,水平條形圖的x和y座標是相反的。

  2. 數據源始終返回相同的數據集。您需要檢查indexRange參數並且只返回請求的範圍。

  3. x軸的繪圖範圍在0和4之間。標籤爲0.5,1.5和2.5。 plotRange是什麼搞亂酒吧間距。將其設置爲默認值nil,您應該看到您想要的外觀。從plotRange docs

如果提供了一個繪圖範圍,該酒吧在整個繪圖範圍均勻分佈的。如果plotRange爲零,則條形位置由Cocoa綁定或條形圖數據源提供。如果位置不是由綁定或數據源提供的,則第一個小節將放置在零(0)處,隨後的小節將位於連續的正整數座標處。