Ich verwende core-plot (und die Barcharts), um finanzielle Informationen anzuzeigen.
Mein Problem ist, dass immer wenn ich negative Werte benutze, scheint die Skala des angezeigten Diagramms falsch zu sein. Ich möchte das gesamte Diagramm sichtbar haben, aber oft wird nur ein Teil des Diagramms angezeigt, wodurch die Balken abgeschnitten sind und manchmal nicht einmal die x-Achse sichtbar ist (der angezeigte Teil ist so weit unten auf der y-Achse). Wenn ich die Benutzerinteraktion aktiviere, ist es möglich, innerhalb der Ansicht zu scrollen, um verschiedene Teile des Diagramms zu sehen, aber ich möchte einen Überblick, nicht das Diagramm im Detail studieren. Beachten Sie, dass ich nicht den gesamten Bildschirm für das Diagramm verwende, sondern nur ungefähr 300x240px.
Aus irgendeinem Grund können neue Benutzer keine Bilder hochladen, daher kann ich keine Screenshots anhängen. Wenn jemand glaubt, dass es bei der Antwort helfen kann (und Zeit hat), würde ich mich freuen, Ihnen zwei Screenshots davon zu senden, wie es mit nur positiven Werten aussieht und wie es mit negativen Werten aussieht.
Ich würde mich sehr über jegliche Hilfe freuen. Vielen Dank.
Der verwendete Code zum Erstellen des Diagramms lautet wie folgt:
- (id)initWithFrame:(CGRect)frame:(FinancialTopicData *) topicDataToSet:(NSArray *) colors {
//Stelle korrekte Daten sicher
assert([topicDataToSet isKindOfClass:[FinancialTopicData class]]);
if ((self = [super initWithFrame:frame])) {
self.topicData = topicDataToSet;
//Erstelle das Diagramm
graph = [[CPXYGraph alloc] initWithFrame:CGRectZero];
CPTheme *theme = [CPTheme themeNamed:kCPPlainWhiteTheme];
[graph applyTheme:theme];
self.hostedLayer = graph;
// Rahmen
graph.plotAreaFrame.borderLineStyle = nil;
graph.plotAreaFrame.cornerRadius = 0.0f;
// Abstände
graph.paddingLeft = 0.0f;
graph.paddingRight = 0.0f;
graph.paddingTop = 0.0f;
graph.paddingBottom = 0.0f;
graph.titlePlotAreaFrameAnchor = CPRectAnchorTop;
//Diagrammpaddings
graph.plotAreaFrame.paddingLeft = 70.0;
graph.plotAreaFrame.paddingTop = 10;
graph.plotAreaFrame.paddingRight = 20.0;
graph.plotAreaFrame.paddingBottom = 45.0;
NSDecimalNumber *intervalDivider = [NSDecimalNumber decimalNumberWithString:@kIntervalDivider];
// Füge Plotbereich für horizontale Balkendiagramme hinzu
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];
//Füge x-Achse hinzu
CPXYAxisSet *axisSet = (CPXYAxisSet *)graph.axisSet;
CPXYAxis *x = axisSet.xAxis;
x.majorTickLineStyle = nil;
x.minorTickLineStyle = nil;
x.majorIntervalLength = CPDecimalFromString(@"1");
x.orthogonalCoordinateDecimal = CPDecimalFromString(@"0");
// Definiere benutzerdefinierte Labels für die Datenelemente
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;
}
Die Datenquellenmethoden:
-(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];
}