Lucrul cu CorePlot Styling și Adding Plots

Când lucrați cu aplicații cu intensitate mare de date, un dezvoltator trebuie să facă deseori mai mult decât să arate liste de înregistrări de date într-o vizualizare de tabel. Biblioteca CorePlot vă va permite să adăugați vizualizări uimitoare de date la aplicațiile dvs. Aflați cum în această serie Tuts + Premium!


Disponibile și în această serie:

  1. Lucrul cu CorePlot: configurarea proiectului
  2. Lucrul cu CorePlot: Bazele fundamentale
  3. Lucrul cu CorePlot: Styling și Adding Plots
  4. Lucrul cu CorePlot: Crearea unui grafic de bare
  5. Lucrul cu CorePlot: Crearea unei diagrame

Unde am plecat

Ultima dată am făcut începutul primului nostru grafic și l-am permis utilizatorului să navigheze acolo din vizualizarea listei. Am aflat despre metodele CPTGraphHostingView, CPTGraph, CPTXYPlotSpace, CPTScatterPlot și metodele CPTScatterPlotDataSource care furnizează date pentru grafic.

Astăzi ne vom uita la modul de a face graficul mai util pentru utilizator prin specificarea incrementelor axei și modul de formatare a etichetelor incrementale. Vom analiza diferite moduri în care putem personaliza aspectul graficului. În cele din urmă, vom discuta cum să lucrăm cu diferite parcele pe un singur grafic. Să începem!


Pasul 1: Setarea incrementărilor axei

Pentru a modifica proprietățile unei axe X și Y lucrăm cu obiectele "CPTXYAxisSet" și "CPTXAxis". Deschideți fișierul STLineGraphViewController.m și accesați metoda ViewDidLoad. Chiar sub locul unde lucrăm cu spațiul Spațiu introduceți următorul cod:

 [[grafic plotAreaFrame] setPaddingLeft: 20.0f]; [[graful plotAreaFrame] setPaddingTop: 10.0f]; [[graful plotAreaFrame] setPaddingBottom: 20.0f]; [[graful plotAreaFrame] setPaddingRight: 10.0f]; [[graful plotAreaFrame] setBorderLineStyle: nil]; NSNumberFormatter * axaFormatter = [[NSNumberFormatter alloc] init]; [axaFormatter setMinimumIntegerDigits: 1]; [axisFormatter setMaximumFractionDigits: 0]; CPTMutableTextStyle * textStyle = [CPTMutableTextStyle textStyle]; [textStyle setFontSize: 12.0f]; CPTXYAxisSet * axaSet = (CPTXYAxisSet *) [axaSetului grafic]; CPTXYAxis * xAxis = [axaSet xAxis]; [xAxis setMajorIntervalLength: CPTDecimalFromInt (1)]; [xAxis setMinorTickLineStyle: zero]; [xAxis setLabelingPolicy: CPTAxisLabelingPolicyFixedInterval]; [xAxis setLabelTextStyle: textStilă]; [xAxis setLabelFormatter: axFormatter]; CPTXYAxis * yAxis = [axSet yAxis]; [yAceste setMajorIntervalLength: CPTDecimalFromInt (1)]; [yAxis setMinorTickLineStyle: zero]; [yAxis setLabelingPolicy: CPTAxisLabelingPolicyFixedInterval]; [yAsis setLabelTextStyle: textStyle]; [yAsis setLabelFormatter: axisFormatter];

Să mergem peste tot. În primul rând, lucrăm cu o proprietate a graficului numită "plotAreaFrame". Cu aceasta putem seta padding-ul zonei unde graficul este desenat si ne permite sa vedem etichetele axelor (care au fost ascunse anterior). Apoi am setat stilul de linie de frontieră la zero pentru a scăpa de marginea din jurul graficului.

Apoi, creăm un formatator NSNumber pe care îl folosim pentru a formata etichetele axelor. De asemenea, creăm ceva numit "CPTMutableTextStyle". Atunci când formatează linii, secțiune de umplere și text pentru obiecte CorePlot folosim obiecte cum ar fi CPTMutableTextStyle pentru a face acest lucru. Deocamdată setăm doar dimensiunea fontului, dar putem seta și tipul de font și culoarea.

Apoi primim un obiect CPTXYAxisSet din graficul nostru. Această axă conține un xAxis și un yAxis (ambele obiecte de tipul "CPTXYAxis"). Apoi am stabilit o varietate de proprietăți pe fiecare axă. Lungimea majoră a intervalului stabilește ce interval va fi la fiecare tick. De asemenea, dorim să scăpăm de căpușe minore, astfel încât să setăm stilul de linie la zero. Am setat politica de etichetare la intervale fixe. Apoi, setăm stilul textului pentru obiectul CPTMutableTextStyle pe care l-am creat mai devreme și formatorul de etichete la NSNumberFormatter pe care l-am creat.


Încercați acum să vizitați elevul și să adăugați un student. După aceea, puteți reveni la grafic și ar trebui să îl vedeți schimbat. Cu toate acestea, se pare încă un pic ...


Pasul 2: Schimbarea aspectului

În primul rând, să schimbăm linia reală. Sub unde lucrăm cu axa, introduceți următorul cod:

 CPTMutableLineStyle * mainPlotLineStyle = [[studentScatterPlot dateLineStyle] mutableCopy]; [mainPlotLineStyle setLineWidth: 2.0f]; [mainPlotLineStyle setLineColor: [CPTColor culoareWithCGColor: [[UICcolor blueColor] CGColor]]]; [studentScatterPlot setDataLineStyle: mainPlotLineStyle];

Aceasta va face ca linia din graficul nostru să fie albastră și să crească lățimea. Dacă sunteți mai creativ puteți face culoarea un pic mai puțin stark dar este important să rețineți că aceasta necesită o valoare CPTColor. În timp ce nu putem obține un CPTColor de la un UICcolor, îl putem obține de la un CGColor.

Putem schimba și stilul de linie al axei. Introduceți următorul cod de mai jos unde am setat dataLineStyle.

 CPTMutableLineStyle * axisLineStyle = [CPTMutableLineStyle lineStyle]; [axisLineStyle setLineWidth: 1]; [axisLineStyle setLineColor: [CPTColor colorWithCGColor: [[UICoror griColor] CGColor]]]; [xAxis setAxisLineStilă: axisLineStyle]; [xAxis setMajorTickLineStilul: axisLineStyle]; [yAu setAxisLineStyle: axisLineStyle]; [yAsis setMajorTickLineStyle: axisLineStyle];

Aceasta stabilește stilul liniei și stilul liniei majore pentru ambele axe. De asemenea, puteți seta culoarea textStyle ca gri, dacă doriți (este graficul dvs., faceți-l să pară că doriți!).

De asemenea, puteți adăuga un gradient de umplere la graficul de linie pentru a îmbunătăți aspectul în continuare. Pentru a face acest lucru, vom crea un obiect CPTFill pe care îl putem atribui parcelei:

 CPTColor * areaColor = [CPTColor blueColor]; CPTGradient * areaGradient = [CPTG gradientul de gradient cuBeginningColor: zonaColor endingColor: [CPTColor clearColor]]; [zonaGradient setAngle: -90.0f]; CPTFill * areaGradientFill = [CPTFill fillWithGradient: areaGradient]; [studentScatterPlot setAreaFill: zonaGradientFill]; [studentScatterPlot setAreaBaseValue: CPTDecimalFromInt (0)];

Acest lucru creează o umplutură de zonă pe care o punem sub graficul de linie care merge de la albastru la clar. Unghiul stabilește direcția de gradient și se stabilește valoarea bazei de zonă unde gradientul începe de pe grafic. Pe măsură ce vrem să începem în partea de jos a graficului, l-am setat la 0.

În cele din urmă, este uneori o idee bună să aveți indicii în care valorile sunt reprezentate grafic pe graficul de linie. Pentru a face acest lucru trebuie să apelăm o metodă de sursă de date CPTScatterPlot denumită 'symbolForScatterPlot: recordIndex':

 - (CPTPlotSymbol *) simbolForScatterPlot: (CPTScatterPlot *) aPlot recordIndex: (NSUInteger) indice CPTPlotSymbol * plotSymbol = [CPTPlotSymbol ellipsePlotSymbol]; [plotSymbol setSize: CGSizeMake (10, 10)]; [plotSymbol setFill: [CPTFill umpleWithColor: [CPTColor blueColor]]]; [plotSymbol setLineStyle: zero]; [aPlot setPlotSymbol: plotSymbol]; returSymbol; 

Codul de mai sus creează și returnează un obiect CPTPlotSymbol. Putem face să pară tot felul de lucruri, dar graficul nostru va folosi o elipsă (cerc) plină cu albastru, cu o dimensiune de 10 pe 10.

După ce ați implementat codul de mai sus, graficul dvs. ar trebui să arate astfel:



Pasul 3: Gestionarea mai multor parcele

Afișăm înscrierea elevilor în timp, dar dacă am fi vrut să vedem înscrierea pentru un anumit subiect pe același grafic?

Obiectele CPTGraph pot face mai multe parcele. Creați un nou complot așa cum am făcut în trecut și adăugați-l în grafic. În metodele de sursă de date obținem identificatorul graficului și, pe baza acestuia, furnizăm datele corecte.

Să mergem mai departe și să creăm un complot care arată înscrierea în timp în domeniul informaticii. Sub codul în care creăm "studentScatterPlot" (în metoda viewDidLoad), adăugați următoarele:

 CPTScatterPlot * csScatterPlot = [[CPTScatterPlot alocare] initWithFrame: [limite grafice]]; [csScatterPlot setIdentifier: @ "csEnrollement"]; [csScatterPlot setDelegare: auto]; [csScatterPlot setDataSource: auto]; [[auto-graf] addPlot: studentScatterPlot]; [[graful propriu] addPlot: csScatterPlot];

În timp ce suntem în această metodă, ar trebui, de asemenea, să-l stilim puțin. Să o facem verde. Sub care am setat dataLineStyle pentru studentPlot, adăugați următorul cod:

 [studentScatterPlot setDataLineStyle: mainPlotLineStyle]; [mainPlotLineStyle setLineColor: [CPTColor greenColor]]; [csScatterPlot setDataLineStilul: mainPlotLineStyle];

Sub care am setat umplutura pentru parcela scatter student, adăugați următorul cod:

 areaColor = [CPTColor greenColor]; zonaGradient = [Gradient CPTGradientWithBeginningColor: zonaColor endingColor: [CPTColor clearColor]]; [zonaGradient setAngle: -90.0f]; zonaGradientFill = [CPTFill fillWithGradient: areaGradient]; [csScatterPlot setAreaFill: zonaGradientFill]; [csScatterPlot setAreaBaseValue: CPTDecimalFromInt (0)];

Am făcut toate astea înainte, așa că nu vom intra în ceea ce se întâmplă. Acum ne vom modifica metoda 'numberForPlot: field: recordIndex:'. Nu trebuie să schimbăm metoda numberOfRecordsForPlot: deoarece oricum vom avea 7 înregistrări. În câmpul numberForPlot: field: recordIndex: localizați unde am setat predicatul și îl modificăm astfel:

 NSPredicate * predicate = zero; dacă [[identificatorul parcelei esteEqual: @ "studentEnrollment"]) predicate = [NSPredicate predicateWithFormat: @ "dayEnrolled ==% d", index];  altfel dacă [[identificatorul parcelei esteEqual: @ "csEnrollement"]) predicate = [NSPredicate predicateWithFormat: @ "dayEnrolled ==% d AND subjectID ==% d", index, 0]; 

Aceasta construiește predicatul pe baza graficului care este reprezentat grafic și primește numărul relevant. În cele din urmă, trebuie să setăm simbolurile pentru graficul subiectului în verde:

 - (CPTPlotSymbol *) simbolForScatterPlot: (CPTScatterPlot *) aPlot recordIndex: (NSUInteger) indice CPTPlotSymbol * plotSymbol = [CPTPlotSymbol ellipsePlotSymbol]; [plotSymbol setSize: CGSizeMake (10, 10)]; dacă [[identificatorul aPlot] este egal: @ "studentEnrollment"]) [plotSymbol setFill: [CPTFill fillWithColor: [CPTColor blueColor]]];  altfel dacă [[identificatorul aPlot] esteEqual: @ "csEnrollement"]) [plotSymbol setFill: [CPTFill fillWithColor: [CPTColor greenColor]]];  [plotSymbol setLineStyle: zero]; [aPlot setPlotSymbol: plotSymbol]; returSymbol; 

Din nou, cele de mai sus ar trebui să fie explicative. Ne uităm la identificatorul parcelei și, bazându-ne pe care este complotul, facem simbolul complotului fie verde, fie albastru.

Acum salvați și rulați graficul și ar trebui să aveți ceva de genul:


Și acolo aveți! Un grafic complet de lucru care indică înscrierea în timp a studenților, precum și înscrierea pentru informatică. După cum puteți vedea, este ușor să adăugați un al doilea grafic după ce ați stabilit graficul inițial. Încercați să adăugați mai mulți studenți la aplicație și la știința calculatoarelor și să vedeți actualizarea graficelor.


Data viitoare

Am acoperit un pic de teren astăzi. Am stabilit modul de a modela graficele noastre, schimbând culorile și lățimile liniei, precum și adăugând umpluturi de gradient. De asemenea, am subliniat modul în care puteți adăuga și gestiona mai multe parcele pe un singur obiect grafic.

Data viitoare se va concentra asupra modului de a crea și a personaliza un grafic de bare care arată numărul total de elevi înscriși în fiecare subiect (fiecare subiect va avea o bară individuală). Prindeți data viitoare!

Cod