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];
}
謝謝,這工作得很好! – OnlyFreeNick 2010-10-20 10:38:22