Bij het werken met gegevensintensieve toepassingen moet een ontwikkelaar vaak meer doen dan alleen lijsten met gegevensrecords weergeven in een tabelweergave. Met de CorePlot-bibliotheek kunt u verbluffende gegevensvisualisaties toevoegen aan uw toepassingen. Ontdek hoe in deze Tuts + Premium-serie!
De laatste keer dat we het begin van onze eerste lijngrafiek maakten en de gebruiker toestonden daarheen te navigeren vanuit de lijstweergave. We hebben geleerd over de CPTGraphHostingView, de CPTGraph, CPTXYPlotSpace, CPTScatterPlot en de CPTScatterPlotDataSource-methoden die gegevens voor de grafiek leveren.
Vandaag zullen we bekijken hoe de grafiek nuttiger voor de gebruiker kan worden gemaakt door as-incrementen op te geven en de oplopende labels op te maken. We gaan kijken naar verschillende manieren waarop we het uiterlijk van de grafiek kunnen aanpassen. Ten slotte gaan we bespreken hoe we met verschillende plots in één grafiek kunnen werken. Laten we beginnen!
Om de eigenschappen van een X- en Y-as te wijzigen, werken we met de objecten 'CPTXYAxisSet' en 'CPTXAxis'. Open het bestand STLineGraphViewController.m en ga naar de methode viewDidLoad. Vlak onder waar we met de plot Space werken, voert u de volgende code in:
[[grafiek plotAreaFrame] setPaddingLeft: 20.0f]; [[grafiek plotAreaFrame] setPaddingTop: 10.0f]; [[graph plotAreaFrame] setPaddingBottom: 20.0f]; [[grafiek plotAreaFrame] setPaddingRight: 10.0f]; [[graph plotAreaFrame] setBorderLineStyle: nil]; NSNumberFormatter * axisFormatter = [[NSNumberFormatter alloc] init]; [axisFormatter setMinimumIntegerDigits: 1]; [axisFormatter setMaximumFractionDigits: 0]; CPTMutableTextStyle * textStyle = [CPTMutableTextStyle textStyle]; [textStyle setFontSize: 12.0f]; CPTXYAxisSet * axisSet = (CPTXYAxisSet *) [graph axisSet]; CPTXYAxis * xAxis = [axisSet xAxis]; [xAxis setMajorIntervalLength: CPTDecimalFromInt (1)]; [xAxis setMinorTickLineStyle: nihil]; [xAxis setLabelingPolicy: CPTAxisLabelingPolicyFixedInterval]; [xAxis setLabelTextStyle: textStyle]; [xAxis setLabelFormatter: axisFormatter]; CPTXYAxis * yAxis = [axisSet yAxis]; [yAxis setMajorIntervalLength: CPTDecimalFromInt (1)]; [yAxis setMinorTickLineStyle: nihil]; [yAxis setLabelingPolicy: CPTAxisLabelingPolicyFixedInterval]; [yAxis setLabelTextStyle: textStyle]; [yAxis setLabelFormatter: axisFormatter];
Laten we alles hierboven bespreken. Ten eerste werken we met een eigenschap van de grafiek genaamd 'plotAreaFrame'. Hiermee kunnen we de opvulling instellen van het gebied waar de grafiek daadwerkelijk wordt getekend en kunnen we de aslabels zien (die voorheen verborgen waren). Vervolgens stellen we de stijl Borderline in op nul om de rand rond de grafiek te verwijderen.
Vervolgens maken we een NSNumber-formattering die we gebruiken om de aslabels op te maken. We maken ook iets genaamd een 'CPTMutableTextStyle'. Wanneer u lijnen opmaakt, sectie en tekst vult voor CorePlot-objecten gebruiken we objecten zoals CPTMutableTextStyle om dit te doen. Voor nu stellen we alleen de lettergrootte in, maar we kunnen ook het lettertype en de kleur instellen.
We krijgen dan een CPTXYAxisSet-object uit onze grafiek. Deze axisSet bevat een xAxis en een yAxis (beide objecten van het type 'CPTXYAxis'). Vervolgens stellen we een verscheidenheid aan eigenschappen in op elke as. De hoofdintervallengte bepaalt wat het interval bij elke hoofdtik zal zijn. We willen ook van de kleine tikken af, zodat we de lijnstijl op nul zetten. We hebben de labellingPolicy ingesteld op vaste intervallen. Vervolgens stellen we de tekststijl in voor het CPTMutableTextStyle-object dat we eerder hebben gemaakt en de labelformattering voor de NSNumberFormatter die we hebben gemaakt.
Probeer nu naar de studentenweergave te gaan en een student toe te voegen. Daarna kun je teruggaan naar de grafiek en zou je het moeten zien veranderen. Het ziet er echter nog steeds een beetje flauw ...
Laten we eerst de eigenlijke regel wijzigen. Hieronder, waar we werken met de as, voert u de volgende code in:
CPTMutableLineStyle * mainPlotLineStyle = [[studentScatterPlot dataLineStyle] mutableCopy]; [mainPlotLineStyle setLineWidth: 2.0f]; [mainPlotLineStyle setLineColor: [CPTColor colorWithCGColor: [[UIColor blueColor] CGColor]]]; [studentScatterPlot setDataLineStyle: mainPlotLineStyle];
Dit maakt de lijn op onze grafiek blauw en vergroot de breedte. Als u creatiever bent, kunt u de kleur iets minder sterk maken, maar het is belangrijk om te weten dat deze een CPTColor-waarde vereist. Hoewel we geen CPTColor van een UIColor kunnen krijgen, kunnen we deze van een CGColor halen.
We kunnen ook de lijnstijl van de as wijzigen. Voer de volgende code hieronder in waar we de plot dataLineStyle instellen.
CPTMutableLineStyle * axisLineStyle = [CPTMutableLineStyle lineStyle]; [axisLineStyle setLineWidth: 1]; [axisLineStyle setLineColor: [CPTColor colorWithCGColor: [[UIColor grayColor] CGColor]]]; [xAxis setAxisLineStyle: axisLineStyle]; [xAxis setMajorTickLineStyle: axisLineStyle]; [yAxis setAxisLineStyle: axisLineStyle]; [yAxis setMajorTickLineStyle: axisLineStyle];
Hiermee stelt u de lijnstijl en de hoofdtekenstijl voor beide assen in. Je kunt ook de textStyle-kleur zo grijs maken als je wilt (het is jouw grafiek, laat het eruit zien zoals jij dat wilt!).
U kunt ook een verloopvulling toevoegen aan de lijngrafiek om het uiterlijk verder te verfraaien. Hiertoe maken we een CPTFill-object dat we vervolgens aan de plot kunnen toewijzen:
CPTColor * areaColor = [CPTColor blueColor]; CPTGradient * areaGradient = [CPTGradient gradientWithBeginningColor: areaColor endingColor: [CPTColor clearColor]]; [areaGradient setAngle: -90.0f]; CPTFill * areaGradientFill = [CPTFill fillWithGradient: areaGradient]; [studentScatterPlot setAreaFill: areaGradientFill]; [studentScatterPlot setAreaBaseValue: CPTDecimalFromInt (0)];
Dit creëert een gebiedsvulling die we onder de lijngrafiek plaatsen die van blauw naar leeg gaat. De hoek stelt de gradiëntrichting in en de gebiedsbasiswaarde stelt in waar de helling vanaf de plot begint. Omdat we onderaan de grafiek willen beginnen, stellen we deze in op 0.
Ten slotte is het soms een goed idee om indicaties te hebben waar de waarden worden uitgezet op de lijngrafiek. Om dit te doen moeten we een CPTScatterPlot datasource-methode genaamd 'symbolForScatterPlot: recordIndex' aanroepen:
- (CPTPlotSymbool *) symbolForScatterPlot: (CPTScatterPlot *) aPlot recordIndex: (NSUInteger) index CPTPlotSymbool * plotSymbol = [CPTPlotSymbool ellipsPlotSymbool]; [plotSymbol setSize: CGSizeMake (10, 10)]; [plotSymbol setFill: [CPTFill fillWithColor: [CPTColor blueColor]]]; [plotSymbol setLineStyle: nil]; [aPlot setPlotSymbol: plotSymbol]; return plotSymbol;
De bovenstaande code maakt en retourneert een CPTPlotSymbool-object. We kunnen het laten lijken op allerlei dingen, maar onze grafiek gebruikt een ellips (cirkel) gevuld met blauw met een grootte van 10 bij 10.
Nadat u de bovenstaande code heeft geïmplementeerd, ziet uw grafiek er ongeveer zo uit:
We laten de inschrijving van studenten in de loop van de tijd zien, maar wat als we de inschrijving voor een specifiek onderwerp in dezelfde grafiek wilden zien?
CPTGraph-objecten kunnen meerdere plots weergeven. We maken een nieuw plot net zoals we in het verleden hebben gedaan en voegen het toe aan de grafiek. In de gegevensbronmethoden krijgen we vervolgens de grafiek-ID en op basis daarvan de juiste gegevens.
Laten we doorgaan en een plot maken waarin de inschrijving voor Computer Science in de loop van de tijd wordt weergegeven. Onder de code waar we de 'studentScatterPlot' (in de methode viewDidLoad) maken, voegt u het volgende toe:
CPTScatterPlot * csScatterPlot = [[CPTScatterPlot alloc] initWithFrame: [graph bounds]]; [csScatterPlot setIdentifier: @ "csEnrollement"]; [csScatterPlot setDelegate: self]; [csScatterPlot setDataSource: self]; [[zelfgrafiek] addPlot: studentScatterPlot]; [[zelfgrafiek] addPlot: csScatterPlot];
Terwijl we in deze methode zitten, zouden we het ook een beetje moeten stylen. Laten we het groen maken. Hieronder, waar we de dataLineStyle voor de studentPlot instellen, voeg je de volgende code toe:
[studentScatterPlot setDataLineStyle: mainPlotLineStyle]; [mainPlotLineStyle setLineColor: [CPTColor greenColor]]; [csScatterPlot setDataLineStyle: mainPlotLineStyle];
Hieronder, waar we de vulling voor de spreidingplot voor studenten instellen, voeg de volgende code toe:
areaColor = [CPTColor greenColor]; areaGradient = [CPTGradient gradientWithBeginningColor: areaColor endingColor: [CPTColor clearColor]]; [areaGradient setAngle: -90.0f]; areaGradientFill = [CPTFill fillWithGradient: areaGradient]; [csScatterPlot setAreaFill: areaGradientFill]; [csScatterPlot setAreaBaseValue: CPTDecimalFromInt (0)];
We hebben dit allemaal eerder gedaan, dus we zullen niet ingaan op wat er gebeurt. Nu gaan we onze 'numberForPlot: field: recordIndex:' methode aanpassen. We hoeven de methode numberOfRecordsForPlot: niet te wijzigen, want we zullen hoe dan ook 7 records hebben. Zoek in de methode numberForPlot: field: recordIndex: naar de plaats waar we het predikaat hebben ingesteld en wijzig het om het volgende te hebben:
NSPredicate * predicate = nil; if ([[plot identifier] isEqual: @ "studentEnrollment"]) predicate = [NSPredicate predicateWithFormat: @ "dayEnled ==% d", index]; else if ([[plot identifier] isEqual: @ "csEnrollement"]) predicate = [NSPredicate predicateWithFormat: @ "dayEnled ==% d AND subjectID ==% d", index, 0];
Hiermee wordt het predicaat geconstrueerd op basis van de grafiek die wordt geplot en de relevante telling. Ten slotte moeten we de symbolen voor de onderwerpgrafiek op groen zetten:
- (CPTPlotSymbool *) symbolForScatterPlot: (CPTScatterPlot *) aPlot recordIndex: (NSUInteger) index CPTPlotSymbool * plotSymbol = [CPTPlotSymbool ellipsPlotSymbool]; [plotSymbol setSize: CGSizeMake (10, 10)]; if ([[aPlot identifier] isEqual: @ "studentEnrollment"]) [plotSymbol setFill: [CPTFill fillWithColor: [CPTColor blueColor]]]; else if ([[aPlot identifier] isEqual: @ "csEnrollement"]) [plotSymbol setFill: [CPTFill fillWithColor: [CPTColor greenColor]]]; [plotSymbol setLineStyle: nil]; [aPlot setPlotSymbol: plotSymbol]; return plotSymbol;
Nogmaals, het bovenstaande zou voor zich spreken. We bekijken de plot-identifier en, op basis van welk plot het is, maken we het plot-symbool groen of blauw.
Sla nu op en voer de grafiek uit en u zou ongeveer het volgende moeten hebben:
En daar heb je het! Een volledig werkende grafiek die de inschrijving van studenten na verloop van tijd laat zien, evenals de inschrijving voor computerwetenschappen. Zoals je ziet, is het vrij eenvoudig om een tweede plot toe te voegen zodra je de eerste grafiek hebt ingesteld. Probeer meer studenten aan de app en Computer Science toe te voegen en de grafiekupdate te bekijken.
We hebben vandaag een beetje aandacht besteed. We hebben vastgesteld hoe onze grafieken moeten worden vormgegeven door lijnkleuren en -breedten te wijzigen en door verloopvullingen toe te voegen. We hebben ook geschetst hoe u meerdere plots in een enkel grafisch object kunt toevoegen en beheren.
De volgende keer gaan we ons richten op het maken en aanpassen van een staafgrafiek die het totale aantal studenten toont dat is ingeschreven voor elk onderwerp (elk onderwerp heeft een afzonderlijke balk). Vang je de volgende keer!