06.02.2011
für CorePlot 0.2.2, Xcode 3.2
CorePlot Liniendiagramme mit Hintergrundfarbe
Im Folgenden wird erklärt, wie man mit dem Mac-Framework CorePlot ein Liniendiagramm erstellt, bei dem der Hintergrund angepaßt wird.
In dem CorePlot Liniendiagramme anpassen wurde erklärt, wie ein Liniendiagramm mit CorePlot erstellt wird. Es wurde auf Themen wie Linienstärke, Linienfarbe, Linienart, Symbole, Symbolfarbe eingegangen. Der folgende Text beschreibt, wie das Liniendiagramm um einen Hintergrund ergänzt werden kann. Zuerst wird ein einfarbigiger Hintergrund gewählt. Später wird das Beispiel um einen Hintergrund mit Farbverlauf erweitert.
Ausgangssituation ist ein grünes Liniendiagramm mit grünen Ellipsen als Symbolmarkierungen. Der Quellcode in der Methode awakeFromNib
dazu sieht so aus:
-(void)awakeFromNib
{
[super awakeFromNib];
data = [[NSArray alloc]initWithObjects:
[NSDecimalNumber numberWithInt:100],
[NSDecimalNumber numberWithInt:130],
[NSDecimalNumber numberWithInt:30],
[NSDecimalNumber numberWithInt:40],
[NSDecimalNumber numberWithInt:60],
[NSDecimalNumber numberWithInt:80],
[NSDecimalNumber numberWithInt:100],
[NSDecimalNumber numberWithInt:120],
[NSDecimalNumber numberWithInt:10],
[NSDecimalNumber numberWithInt:15],
[NSDecimalNumber numberWithInt:20],
[NSDecimalNumber numberWithInt:100],
nil ];
// Create graph and set a theme
graph = [[CPXYGraph alloc] initWithFrame:CGRectZero];
CPTheme *theme = [CPTheme themeNamed:kCPDarkGradientTheme];
[graph applyTheme:theme];
view.hostedLayer = graph;
// Define the space for the bars. (12 Points with a max height of 150)
CPXYPlotSpace *plotSpace = (CPXYPlotSpace *)graph.defaultPlotSpace;
plotSpace.yRange = [CPPlotRange plotRangeWithLocation:CPDecimalFromFloat(0.0f)
length:CPDecimalFromFloat(150.0f)];
plotSpace.xRange = [CPPlotRange plotRangeWithLocation:CPDecimalFromFloat(0.0f)
length:CPDecimalFromFloat(11.0f)];
// ScatterPlot
CPScatterPlot *linePlot = [[[CPScatterPlot alloc] init] autorelease];
linePlot.identifier = @"LinienDiagramm";
linePlot.dataLineStyle.lineWidth = 2.f;
linePlot.dataLineStyle.lineColor = [CPColor greenColor];
linePlot.dataSource = self;
[graph addPlot:linePlot];
CPLineStyle *symbolLineStyle = [CPLineStyle lineStyle];
symbolLineStyle.lineColor = [CPColor greenColor];
symbolLineStyle.lineWidth = 2.f;
CPPlotSymbol *plotSymbol = [CPPlotSymbol ellipsePlotSymbol];
plotSymbol.fill = [CPFill fillWithColor:[CPColor greenColor]];
plotSymbol.lineStyle = symbolLineStyle;
plotSymbol.size = CGSizeMake(10.0, 10.0);
linePlot.plotSymbol = plotSymbol;
}
Wenn die Methode awakeFromNib
in das Tutorial: CorePlot Liniendiagramm eingebaut und kompiliert wird, dann ist nach dem Start des Programms folgendes zu sehen:
Einen einfarbigen Hintergrund fügt man durch das Ergänzen der folgenden beiden Zeilen ein. Dabei definiert die erste Zeile die Füllfarbe und die zweite Zeile den Basiswert areaBaseValue
von dem ab der Hintergrund gefüllt werden soll. Bei einem areaBaseValue
von 0
wird der untere Teil des Diagramms mit der angegebenen Farbe gefüllt. Wird der Basiswert areaBaseValue
auf 150.0
gesetzt, dann wird die Hintergrundfarbe oberhalb der Linie eingesetzt. Es ist natürlich auch möglich einen Wert dazwischen zu wählen. Beispielsweise 75.0
. Dadurch wird nach jedem Schnittpunkt von Diagrammlinie und Basiswert der Füllbereich zwischen oben und unten gewechselt.
linePlot.areaFill = [CPFill fillWithColor:[CPColor greenColor]];
linePlot.areaBaseValue = CPDecimalFromString(@"0");
Das Ergebnis für die drei unterschiedlichen areaBaseValue
s sieht so aus:
Um einen Hintergrund mit Farbverlauf hinzuzufügen, muß als erstes ein CPGradient
definiert werden. In dem Beispiel wird ein Farbverlauf von grün nach weiß verwendet. Der angle
gibt den Winkel an, wie die Farben verlaufen sollen. -90 Grad bedeutet horizontal. Soll der Farbverlauf von links nach rechts verlaufen, kann der Wert 0 verwendet werden. Mit -180 Grad wird ein Farbverlauf von rechts nach links erreicht (Siehe Screenshots unten). Nach dem Definieren des CPGradient
, wird ein neues Objekt vom Typ CPFill
mit dem eben erstellten Gradienten erstellt und der Variable areaFill
zugewiesen.
CPGradient *areaGradient =
[CPGradient gradientWithBeginningColor:[CPColor greenColor]
endingColor:[CPColor whiteColor]];
areaGradient.angle = -90.0f;
linePlot.areaFill = [CPFill fillWithGradient:areaGradient];
linePlot.areaBaseValue = CPDecimalFromString(@"0");
Die folgenden Abbildungen zeigen die Liniendiagramme mit den verschiedenen Winkeln (angle
).
Einen weiteren sehr schönen Effekt erreicht man, indem als endingColor
oder beginningColor
der Wert clearColor
verwendet wird. Der Wert clearColor
bedeutet soviel wie transparent. Dadurch wird erreicht, daß die Farbe mit der Hintergrundfarbe verläuft.