2010-10-11 25 views
2

我正在使用核心圖(和barcharts)來顯示財務信息。如何縮放圖以適應可見空間

我的問題是,每當我使用負值,似乎顯示的圖形的比例是錯誤的。我希望整個圖形都可見,但通常只顯示圖形的一部分,使條形斷開,有時甚至不可見x軸(所顯示的零件在y軸上如此之遠) 。如果我打開用戶交互,可以在視圖中滾動查看圖形的不同部分,但我想要一個概述,而不是詳細研究圖形。請注意,我不使用整個屏幕的圖形,但只有大約300x240px。

由於某些原因,新用戶不允許發佈圖片,因此我無法附上屏幕截圖。如果有人認爲它可以幫助解決問題(並且有時間),我很樂意向您發送兩張屏幕截圖,其中只顯示正值,以及負值顯示的外觀。

我真的很感謝任何幫助,我可以得到。謝謝。

我使用來產生曲線圖是如下所述的代碼:

- (id)initWithFrame:(CGRect)frame:(FinancialTopicData *) topicDataToSet:(NSArray *) colors { 

//Assert correct data 
assert([topicDataToSet isKindOfClass:[FinancialTopicData class]]); 

if ((self = [super initWithFrame:frame])) { 

    self.topicData = topicDataToSet; 

    //Create the graph 
    graph = [[CPXYGraph alloc] initWithFrame:CGRectZero]; 

    CPTheme *theme = [CPTheme themeNamed:kCPPlainWhiteTheme]; 
    [graph applyTheme:theme]; 
    self.hostedLayer = graph; 

    // Border 
    graph.plotAreaFrame.borderLineStyle = nil; 
    graph.plotAreaFrame.cornerRadius = 0.0f; 

    // Paddings 
    graph.paddingLeft = 0.0f; 
    graph.paddingRight = 0.0f; 
    graph.paddingTop = 0.0f; 
    graph.paddingBottom = 0.0f; 
    graph.titlePlotAreaFrameAnchor = CPRectAnchorTop; 

    //Plot padding 
    graph.plotAreaFrame.paddingLeft = 70.0; 
    graph.plotAreaFrame.paddingTop = 10; 
    graph.plotAreaFrame.paddingRight = 20.0; 
    graph.plotAreaFrame.paddingBottom = 45.0; 

    NSDecimalNumber *intervalDivider = [NSDecimalNumber decimalNumberWithString:@kIntervalDivider]; 

    // Add plot space for horizontal bar charts 
    NSDecimalNumber *numberDecimalValueMaxUp = [[topicData maxValueRoundedUp] decimalNumberByAdding:[[[topicData maxValueRoundedUp] decimalNumberBySubtracting:[topicData minValueRoundedDown]] decimalNumberByDividingBy:intervalDivider]]; 
    NSDecimal decimalValueMaxUp = [numberDecimalValueMaxUp decimalValue]; 
    NSDecimal decimalValueMinDown = [[topicData minValueRoundedDown] decimalValue]; 
    NSInteger numberOfTypes = [[topicData years] count]; 
    NSDecimal numberOfBars = [[NSNumber numberWithInteger:numberOfTypes] decimalValue]; 
    NSDecimalNumber *yInterval = [[numberDecimalValueMaxUp decimalNumberBySubtracting:[topicData minValueRoundedDown]] decimalNumberByDividingBy:intervalDivider]; 

    CPXYPlotSpace *plotSpace = (CPXYPlotSpace *)graph.defaultPlotSpace; 

    plotSpace.yRange = [CPPlotRange plotRangeWithLocation:decimalValueMinDown length:decimalValueMaxUp]; 

    plotSpace.xRange = [CPPlotRange plotRangeWithLocation:CPDecimalFromFloat(0.0f) length:numberOfBars]; 


    //Add x-axis 
    CPXYAxisSet *axisSet = (CPXYAxisSet *)graph.axisSet; 
    CPXYAxis *x = axisSet.xAxis; 
    x.majorTickLineStyle = nil; 
    x.minorTickLineStyle = nil; 
    x.majorIntervalLength = CPDecimalFromString(@"1"); 
    x.orthogonalCoordinateDecimal = CPDecimalFromString(@"0"); 

    // Define some custom labels for the data elements 
    x.labelRotation = M_PI/4; 
    x.labelingPolicy = CPAxisLabelingPolicyNone; 


    NSMutableArray *customTickLocations = [NSMutableArray new]; 
    NSArray *xAxisLabels = [topicData years]; 

    for(int i = 0; i < [xAxisLabels count];i++){ 
     [customTickLocations addObject:[NSDecimalNumber numberWithFloat:0.5f+i*1.0f]]; 
    } 

    NSUInteger labelLocation = 0; 
    NSMutableArray *customLabels = [NSMutableArray arrayWithCapacity:[xAxisLabels count]]; 

    for (NSNumber *tickLocation in customTickLocations) { 

     CPAxisLabel *newLabel = [[CPAxisLabel alloc] initWithText: [xAxisLabels objectAtIndex:labelLocation++] textStyle:x.labelTextStyle]; 
     newLabel.tickLocation = [tickLocation decimalValue]; 
     newLabel.offset = x.labelOffset + x.majorTickLength*(numberOfTypes/2); 
     newLabel.rotation = M_PI/4; 
     [customLabels addObject:newLabel]; 
     [newLabel release]; 
    } 

    x.axisLabels = [NSSet setWithArray:customLabels]; 

    [customTickLocations release]; 

    CPXYAxis *y = axisSet.yAxis; 
    y.minorTickLineStyle = nil; 
    y.majorIntervalLength = [yInterval decimalValue]; 
    y.orthogonalCoordinateDecimal = CPDecimalFromString(@"0"); 

    int i = 0; 

    for(NSString *key in [topicData types]){ 

     CPBarPlot *barPlot = [CPBarPlot tubularBarPlotWithColor:[colors objectAtIndex:(i%[colors count])] horizontalBars:NO]; 
     i++; 

     barPlot.baseValue = CPDecimalFromString(@"0"); 
     barPlot.dataSource = topicData; 
     barPlot.barOffset = 1.0f+i; 
     barPlot.identifier = key; 
     barPlot.delegate = topicData; 
     barPlot.needsDisplayOnBoundsChange = YES;  

     [graph addPlot:barPlot toPlotSpace:plotSpace]; 
    } 


} 
return self; 
} 

數據源的方法:

-(NSNumber *)numberForPlot:(CPPlot *)plot 
       field:(NSUInteger)fieldEnum 
      recordIndex:(NSUInteger)index { 
NSNumber *num = nil;  
if ([plot isKindOfClass:[CPBarPlot class]]) {       
    switch (fieldEnum) { 
     case CPBarPlotFieldBarLocation:{ 
      num = [NSDecimalNumber numberWithUnsignedInteger:index]; 
      break; 
     }  
     case CPBarPlotFieldBarLength:{ 
      NSString *stringValue = [[[types objectForKey:plot.identifier] objectForKey:[years objectAtIndex:index]] objectForKey:KEY_COMPANY_FINANCIALS_VALUE];     
      num = [formatter numberFromString:stringValue]; 
      break; 
     } 
    } 
} 
return num; 
} 


-(NSUInteger)numberOfRecordsForPlot:(CPPlot *)plot{ 
return [years count]; 
} 

回答

1

plotSpace.yRange長度應decimalValueMaxUpdecimalValueMinDown之間的差。

+0

謝謝,這工作得很好! – OnlyFreeNick 2010-10-20 10:38:22