23.10.2011

aktualisierte Version für CorePlot 0.9, Xcode 4

CorePlot: Liniendiagramme anpassen

In dem Beispiel wird ausgehend von Tutorial: CorePlot Liniendiagramm das Liniendiagramm so angepaßt, daß eine blaue, gestrichelte Linie mit runden weißen Markierungen zu sehen ist. Dabei wird die Breite der Markierungsumrandung verändert und die Füllfarbe wird über den rgb-Wert festgelegt. Die Veränderungen werden sukzessive in dem Beispiel ergänzt.

Als erstes wird ein Diagramm erstellt, mit einer blauen Linie und runden weißen Markierungen. Dazu ist es notwendig folgenden Programmcode in der Methode awakeFromNib zu ergänzen:

CPTPlotSymbol *plotSymbol = [CPTPlotSymbol ellipsePlotSymbol];
plotSymbol.fill =
[CPTFill fillWithColor:[CPTColor colorWithComponentRed:255.0 green:255.0 blue:255.0 alpha:1.0]];
plotSymbol.size = CGSizeMake(15.0, 15.0);
linePlot.plotSymbol = plotSymbol;

Das Ergebnis sieht so aus:

Wie man sieht, werden die weißen Markierungen von einer dünnen schwarzen Linie umrundet. Die nächste Erweiterung sorgt dafür, daß die Markierungen von einer blauen Linie mit der Breite 3 umrundet werden:

CPTMutableLineStyle *symbolLineStyle = [[plotSymbol.lineStyle mutableCopy] autorelease];
symbolLineStyle.lineColor = [CPTColor blueColor];
symbolLineStyle.lineWidth = 3.f;
plotSymbol.lineStyle = symbolLineStyle;

Das Resultat ist in folgender Abbildung zu sehen:

Was jetzt noch fehlt ist die gestrichelte Linie. Dies läßt sich dadurch erreichen, daß ein dashPattern festgelegt wird.

lineStyle.dashPattern =
    [NSArray arrayWithObjects:
     [NSNumber numberWithFloat:5.0f],
     [NSNumber numberWithFloat:3.0f],
     nil];

Der erste Float-Wert legt die Länge der Linie fest, d.h. die Länge eines Strichs. Der zweite Wert sorgt für einen Abstand von 3 Pixel zwischen den Strichen. Das fertige Ergebnis sieht nun folgendermaßen aus:

Der vollständige Quellcode der Methode awakeFromNib für dieses Liniendiagramm ist hier nochmal zu sehen:

-(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 = [[CPTXYGraph alloc] initWithFrame:CGRectZero];
CPTTheme *theme = [CPTTheme themeNamed:kCPTDarkGradientTheme];
[graph applyTheme:theme];
view.hostedGraph = graph;

// Define the space for the bars. (12 Points with a max height of 150)
CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)graph.defaultPlotSpace;
plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.0f)
                                               length:CPTDecimalFromFloat(150.0f)];
plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.0f)
                                               length:CPTDecimalFromFloat(11.0f)];


// ScatterPlot
CPTScatterPlot *linePlot = [[[CPTScatterPlot alloc] init] autorelease];
linePlot.identifier = @"LinienDiagramm";

CPTMutableLineStyle *lineStyle = [[linePlot.dataLineStyle mutableCopy] autorelease];
lineStyle.lineWidth = 3.f;
lineStyle.dashPattern =  [NSArray arrayWithObjects:
              [NSNumber numberWithFloat:5.0f],
              [NSNumber numberWithFloat:3.0f],
               nil];

lineStyle.lineColor = [CPTColor blueColor];

linePlot.dataLineStyle = lineStyle;

CPTPlotSymbol *plotSymbol = [CPTPlotSymbol ellipsePlotSymbol];
plotSymbol.fill =
[CPTFill fillWithColor:[CPTColor colorWithComponentRed:255.0 green:255.0 blue:255.0 alpha:1.0]];
plotSymbol.size = CGSizeMake(15.0, 15.0);

CPTMutableLineStyle *symbolLineStyle = [[plotSymbol.lineStyle mutableCopy] autorelease];
symbolLineStyle.lineColor = [CPTColor blueColor];
symbolLineStyle.lineWidth = 3.f;
plotSymbol.lineStyle = symbolLineStyle;


linePlot.plotSymbol = plotSymbol;

linePlot.dataSource = self;

[graph addPlot: linePlot];

}