我正在使用核心图(和条形图)来显示财务信息。
我的问题是每当我使用负值时,似乎所显示图表的比例都是错误的。我希望整个图形都是可见的,但通常只显示图形的一部分,使条形截止,有时甚至不能看到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];
}
答案 0 :(得分:1)
plotSpace.yRange
的长度应该是decimalValueMaxUp
和decimalValueMinDown
之间的差异。