Arbeiten mit CorePlot Gestaltung und Hinzufügen von Plots

Wenn Sie mit datenintensiven Anwendungen arbeiten, muss ein Entwickler oft mehr als nur Listen von Datensätzen in einer Tabellensicht anzeigen. Mit der CorePlot-Bibliothek können Sie Ihren Anwendungen beeindruckende Datenvisualisierungen hinzufügen. In dieser Tuts + Premium-Serie erfahren Sie, wie es geht!


Auch in dieser Serie erhältlich:

  1. Arbeiten mit CorePlot: Projekteinrichtung
  2. Arbeiten mit CorePlot: Plot-Grundlagen
  3. Arbeiten mit CorePlot: Gestaltung und Hinzufügen von Plots
  4. Arbeiten mit CorePlot: Erstellen eines Balkendiagramms
  5. Mit CorePlot arbeiten: Kreisdiagramm erstellen

Wo wir aufgehört haben

Letztes Mal haben wir den Anfang unserer ersten Liniendiagramme gemacht und dem Benutzer die Navigation in der Listenansicht ermöglicht. Wir haben etwas über die Methoden CPTGraphHostingView, CPTGraph, CPTXYPlotSpace, CPTScatterPlot und CPTScatterPlotDataSource erfahren, die Daten für das Diagramm bereitstellen.

Heute werden wir uns ansehen, wie Sie den Graphen für den Benutzer nützlicher gestalten können, indem Sie Achsinkremente angeben und wie die Inkrementlabel formatiert werden. Wir werden uns verschiedene Möglichkeiten ansehen, wie wir das Aussehen und Verhalten der Grafik anpassen können. Zum Schluss werden wir diskutieren, wie Sie mit verschiedenen Darstellungen in einem einzigen Diagramm arbeiten. Lass uns anfangen!


Schritt 1: Einstellen der Achseninkremente

Um die Eigenschaften einer X- und Y-Achse zu ändern, arbeiten wir mit den Objekten 'CPTXYAxisSet' und 'CPTXAxis'. Öffnen Sie die Datei STLineGraphViewController.m und wechseln Sie zur viewDidLoad-Methode. Geben Sie unterhalb der Stelle, an der wir mit dem Plot Space arbeiten, den folgenden Code ein:

 [[graph plotAreaFrame] setPaddingLeft: 20.0f]; [[graph plotAreaFrame] setPaddingTop: 10.0f]; [[graph plotAreaFrame] setPaddingBottom: 20.0f]; [[graph plotAreaFrame] setPaddingRight: 10.0f]; [[graph plotAreaFrame] setBorderLineStyle: nil]; NSNumberFormatter * axisFormatter = [[NSNumberFormatter-Zuordnung] init]; [axisFormatter setMinimumIntegerDigits: 1]; [axisFormatter setMaximumFractionDigits: 0]; CPTMutableTextStyle * textStyle = [CPTMutableTextStyle textStyle]; [textStyle setFontSize: 12.0f]; CPTXYAxisSet * axisSet = (CPTXYAxisSet *) [Diagramm axisSet]; CPTXYAxis * xAxis = [axisSet xAxis]; [xAxis setMajorIntervalLength: CPTDecimalFromInt (1)]; [xAxis setMinorTickLineStyle: nil]; [xAxis setLabelingPolicy: CPTAxisLabelingPolicyFixedInterval]; [xAxis setLabelTextStyle: textStyle]; [xAxis setLabelFormatter: axisFormatter]; CPTXYAxis * yAxis = [axisSet yAxis]; [yAxis setMajorIntervalLength: CPTDecimalFromInt (1)]; [yAxis setMinorTickLineStyle: nil]; [yAxis setLabelingPolicy: CPTAxisLabelingPolicyFixedInterval]; [yAxis setLabelTextStyle: textStyle]; [yAxis setLabelFormatter: axisFormatter];

Lass uns über alles oben gehen. Zunächst arbeiten wir mit einer Eigenschaft des Diagramms namens "plotAreaFrame". Damit können wir die Auffüllung des Bereichs festlegen, in dem der Graph tatsächlich gezeichnet wird. Dadurch können wir die Achsenbeschriftungen (die zuvor ausgeblendet waren) sehen. Dann setzen wir den Randstil "Rand" auf "Null", um den Rand um das Diagramm herum zu entfernen.

Dann erstellen wir ein NSNumber-Formatierungsprogramm, mit dem wir die Achsenbeschriftungen formatieren. Wir erstellen auch etwas namens "CPTMutableTextStyle". Beim Formatieren von Linien, Füllabschnitten und Text für CorePlot-Objekte verwenden wir dazu Objekte wie CPTMutableTextStyle. Momentan legen wir nur die Schriftgröße fest, können aber auch Schriftart und Farbe festlegen.

Wir erhalten dann ein CPTXYAxisSet-Objekt aus unserer Grafik. Dieses axisSet enthält eine xAxis und eine YAxis (beide Objekte vom Typ 'CPTXYAxis'). Wir legen dann auf jeder Achse verschiedene Eigenschaften fest. Die Hauptintervalllänge legt fest, wie das Intervall bei jedem Hauptstrich sein wird. Wir möchten auch die kleinen Häkchen loswerden, also setzen wir den Linienstil auf Null. Wir haben die Beschriftungspolitik auf feste Intervalle gesetzt. Dann setzen wir den Textstil für das CPTMutableTextStyle-Objekt, das wir zuvor erstellt haben, und das Beschriftungsformatierungsprogramm auf den von uns erstellten NSNumberFormatter.


Versuchen Sie jetzt, zur Schüleransicht zu wechseln und einen Schüler hinzuzufügen. Danach können Sie zum Diagramm zurückkehren und es sollte sich ändern. Es sieht aber immer noch ein bisschen fad aus…


Schritt 2: Aussehen ändern

Lassen Sie uns zunächst die tatsächliche Zeile ändern. Geben Sie unter dem Punkt, an dem wir mit der Achse arbeiten, den folgenden Code ein:

 CPTMutableLineStyle * mainPlotLineStyle = [[studentScatterPlot dataLineStyle] mutableCopy]; [mainPlotLineStyle setLineWidth: 2.0f]; [mainPlotLineStyle setLineColor: [CPTColor colorWithCGColor: [[UIColor blueColor] CGColor]]; [studentScatterPlot setDataLineStyle: mainPlotLineStyle];

Dadurch wird die Linie in unserem Diagramm blau und die Breite wird vergrößert. Wenn Sie kreativer sind, können Sie die Farbe etwas weniger stark machen, aber es ist wichtig zu wissen, dass ein CPTColor-Wert erforderlich ist. Während wir keinen CPTColor von einem UIColor erhalten können, können wir ihn von einem CGColor erhalten.

Wir können auch den Linienstil der Achse ändern. Geben Sie den folgenden Code ein, an dem wir den Plot dataLineStyle festlegen.

 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];

Dadurch werden der Linienstil und der Hauptstrichstrich für beide Achsen festgelegt. Sie können die textStyle-Farbe auch als Grau festlegen (wenn es Ihnen gefällt (es ist Ihr Diagramm, sodass es so aussieht, wie Sie es möchten!).

Sie können dem Liniendiagramm auch eine Verlaufsfüllung hinzufügen, um das Aussehen weiter zu verbessern. Dazu erstellen wir ein CPTFill-Objekt, das wir dann der Zeichnung zuordnen können:

 CPTColor * areaColor = [CPTColor blueColor]; CPTGradient * areaGradient = [CPTGradient-GradientWithBeginningColor: areaColor-Endfarbe: [CPTColor clearColor]]; [areaGradient setAngle: -90.0f]; CPTFill * areaGradientFill = [CPTFill fillWithGradient: areaGradient]; [studentScatterPlot setAreaFill: areaGradientFill]; [studentScatterPlot setAreaBaseValue: CPTDecimalFromInt (0)];

Dadurch wird eine Flächenfüllung erstellt, die wir unter das Liniendiagramm einfügen, die von blau nach klar geht. Der Winkel legt die Gradientenrichtung fest und der Flächenbasiswert legt fest, von wo aus der Gradient in der Grafik beginnt. Da wir am unteren Rand des Diagramms beginnen möchten, setzen wir es auf 0.

Schließlich ist es manchmal eine gute Idee, Angaben zu machen, wo die Werte im Liniendiagramm dargestellt werden. Dazu müssen wir eine CPTScatterPlot-Datenquellenmethode namens 'symbolForScatterPlot: recordIndex' aufrufen:

 - (CPTPlotSymbol *) symbolForScatterPlot: (CPTScatterPlot *) aPlot recordIndex: (NSUInteger) index CPTPlotSymbol * plotSymbol = [CPTPlotSymbol ellipsePlotSymbol]; [plotSymbol setSize: CGSizeMake (10, 10)]; [plotSymbol setFill: [CPTFill fillWithColor: [CPTColor blueColor]]]; [plotSymbol setLineStyle: nil]; [aPlot setPlotSymbol: plotSymbol]; return plotSymbol; 

Der obige Code erstellt ein CPTPlotSymbol-Objekt und gibt dieses zurück. Wir können es so aussehen lassen wie alle möglichen Dinge, aber unser Graph wird eine Ellipse (Kreis) verwenden, die mit einer Größe von 10 x 10 gefüllt ist.

Nachdem Sie den obigen Code implementiert haben, sollte Ihr Diagramm ungefähr so ​​aussehen:



Schritt 3: Mehrere Plots verwalten

Wir zeigen die Studentenanmeldung im Laufe der Zeit, aber was wäre, wenn wir die Registrierung für ein bestimmtes Thema in derselben Grafik sehen wollten?

CPTGraph-Objekte können mehrere Darstellungen darstellen. Wir erstellen eine neue Zeichnung wie in der Vergangenheit und fügen sie der Grafik hinzu. In den Datenquellenmethoden erhalten wir dann den Graphenbezeichner und liefern auf dieser Grundlage die korrekten Daten.

Gehen wir weiter und erstellen Sie ein Diagramm, das die Einschreibung über die Zeit für Informatik zeigt. Fügen Sie unter dem Code, in dem wir "studentScatterPlot" (in der Methode viewDidLoad) erstellen, Folgendes hinzu:

 CPTScatterPlot * csScatterPlot = [[Zuweisung von CPTScatterPlot] initWithFrame: [Diagrammgrenzen]]; [csScatterPlot setIdentifier: @ "csEnrollement"]; [csScatterPlot setDelegate: self]; [csScatterPlot setDataSource: self]; [[self graph] addPlot: studentScatterPlot]; [[self graph] addPlot: csScatterPlot];

Wenn wir uns in dieser Methode befinden, sollten wir sie auch ein wenig stylen. Lass es uns grün machen. Fügen Sie unterhalb der Stelle, an der wir dataLineStyle für studentPlot festgelegt haben, folgenden Code hinzu:

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

Fügen Sie unterhalb der Stelle, an der die Füllung für das Schüler-Streudiagramm festgelegt wird, folgenden Code hinzu:

 areaColor = [CPTColor greenColor]; areaGradient = [CPTGradient gradientWithBeginningColor: areaColor-Endfarbe: [CPTColor clearColor]]; [areaGradient setAngle: -90.0f]; areaGradientFill = [CPTFill fillWithGradient: areaGradient]; [csScatterPlot setAreaFill: areaGradientFill]; [csScatterPlot setAreaBaseValue: CPTDecimalFromInt (0)];

Wir haben das alles schon einmal gemacht, also gehen wir nicht auf das ein, was passiert. Jetzt ändern wir unsere Methode 'numberForPlot: field: recordIndex:'. Wir müssen die numberOfRecordsForPlot: -Methode nicht ändern, da in beiden Fällen 7 Datensätze vorhanden sind. Suchen Sie in der numberForPlot: field: recordIndex: -Methode, wo wir das Prädikat festlegen, und ändern Sie es, um Folgendes zu erhalten:

 NSPredicate * prädikat = null; if ([[Diagrammkennung] istEqual: @ "studentEnrollment"]) prädikat = [NSPredicate predicateWithFormat: @ "dayEnrolled ==% d", index];  else if ([[Diagrammkennung] istEqual: @ "csEnrollement"]) prädikat = [NSPredicate predicateWithFormat: @ "dayEnrolled ==% d AND subjectID ==% d", index, 0]; 

Dadurch wird das Prädikat basierend auf dem geplotteten Graphen erstellt und die relevante Anzahl ermittelt. Zum Schluss müssen wir die Symbole für das Subjektdiagramm auf Grün setzen:

 - (CPTPlotSymbol *) symbolForScatterPlot: (CPTScatterPlot *) aPlot recordIndex: (NSUInteger) index CPTPlotSymbol * plotSymbol = [CPTPlotSymbol ellipsePlotSymbol]; [plotSymbol setSize: CGSizeMake (10, 10)]; if ([[aPlot Identifier] isEqual: @ "studentEnrollment"]) [plotSymbol setFill: [CPTFill fillWithColor: [CPTColor blueColor]]];  else if ([[aPlot-Bezeichner] istEqual: @ "csEnrollement"]) [plotSymbol setFill: [CPTFill fillWithColor: [CPTColor greenColor]]];  [plotSymbol setLineStyle: nil]; [aPlot setPlotSymbol: plotSymbol]; return plotSymbol; 

Wieder sollte das Obige selbsterklärend sein. Wir betrachten den Plotbezeichner und machen das Plotsymbol basierend auf dem Plot entweder grün oder blau.

Jetzt speichern und ausführen Sie die Grafik und Sie sollten etwa Folgendes haben:


Und da hast du es! Ein voll funktionsfähiges Diagramm, das die Schüleranmeldungen im Laufe der Zeit sowie die Anmeldung für Informatik zeigt. Wie Sie sehen, ist es ziemlich einfach, eine zweite Grafik hinzuzufügen, sobald Sie die erste Grafik eingerichtet haben. Fügen Sie der App und der Informatik weitere Schüler hinzu und sehen Sie sich die Aktualisierung der Grafik an.


Nächstes Mal

Wir haben heute ein bisschen Boden gelegt. Wir haben festgelegt, wie Sie unsere Diagramme formatieren, indem Sie Linienfarben und -breiten ändern und Farbverläufe hinzufügen. Außerdem haben wir beschrieben, wie Sie mehrere Diagramme zu einem einzelnen Diagrammobjekt hinzufügen und verwalten können.

Beim nächsten Mal konzentrieren wir uns auf das Erstellen und Anpassen eines Balkendiagramms, das die Gesamtzahl der in den einzelnen Fächern eingeschriebenen Schüler zeigt (jedes Fach hat eine eigene Leiste). Fang dich das nächste Mal!